2015-09-04 66 views
3

我用Perl工作,我有隻有一個字的數組:如何將單詞分解爲其組件字母?

@example = ("helloword") 

我要生成另一個數組,其中每個元素是從字的信:

@example2 = ("h", "e", "l"...) 

我需要要做到這一點,因爲我需要計算「h」,「e」的數字......我該怎麼做?

+2

你需要計算在單詞的字母數,或者你需要計算的話'h's的數量? – ThisSuitIsBlackNot

回答

5

要指望有多少次字母串發生,

print "helloword" =~ tr/h//; # for 'h' letter 

否則你可以分割字符串並分配列表到array,

my @example2 = split //, $example[0]; 
-1

你可以cou rse使用split(//,"helloworld"),但這並不像解壓縮那樣高效。搞清楚提供解壓縮的模板可能有點陡峭,但這應該適合你:unpack('(A)*',"helloworld")。例如:

perl -e 'print(join("\n",unpack("(A)*","helloworld")),"\n")' 
h 
e 
l 
l 
o 
w 
o 
r 
l 
d 

要計算的字母數,你既可以假定一個「字」的每一個字符,你分割字符串成是一個字母,簡單地評價在標量上下文(或使用清單「長度「),例如print(scalar(@letters),"\n");print(length(@letters),"\n"),或者你可以創建一個計數變量,並在當信模式相匹配的地圖增加了,如:

my $cnt = 0; 
foreach(@chars){$cnt++ if(/\w/)} 
print("$cnt\n"); 

或者你可以使用與grep的標招列表相同的評價:

print(scalar(grep {/\w/} @chars),"\n"); 

當然,在perl中,還有其他方法可以做到這一點。

編輯:如果我誤解了問題,你要知道有多少每個字母出現在字符串中的,那麼這應該足夠了:

$cnt = 0; 
foreach(unpack("(A)*","helloworld"))) 
    { 
    next unless(/\w/); 
    $hash->{$_}->{ORD} = $cnt++ unless(exists($hash->{$_})); 
    $hash->{$_}->{CNT}++; 
    } 

foreach(sort {$hash->{$a}->{ORD} <=> $hash->{$b}->{ORD}} 
     keys(%$hash)) 
    {print("$_\t$hash->{$_}->{CNT}\n")} 

該解決方案具有保持獨特的優勢按照它們在第一次出現時的順序排列字母。

+1

你碰巧是'基準'兩個?我做了,而'分裂'結果顯然更有效率。也許'單獨解包'的速度會更快,但單靠這一點並不能給OP提供什麼所需。 – stevieb

+1

我同意@ stevieb的基準,除此之外,代碼清晰性通常比性能更重要。 (在我的低級虛擬機上,'split'和'unpack'都可以每秒分割成10,000個字符的字符串數百次)。另外,在無效上下文中的映射通常比for循環更清晰。 – ThisSuitIsBlackNot

+0

我已經在其他情況下使用長DNA字符串進行基準解壓縮和拆分,並且解包速度更快,因此它可能取決於字符串長度。但我們不知道OP是否處理了大量的字符串。我們得到的僅僅是helloworld的例子。所以這仍然是一個有效的建議。我會承認分割肯定更具可讀性,這是解壓縮陷入不適的主要原因。爲什麼我的建議沒有給OP提供什麼? – hepcat72

3

我並不完全清楚你需要計算什麼,但也許你可以從這個例子中拿出一些片斷,它使用散列來存儲字母和每個的計數...

use warnings; 
use strict; 

my @array = 'helloworld'; 

my %letters; 
$letters{$_}++ for split //, $array[0]; 

my $total; 

while (my ($k, $v) = each %letters){ 
    $total += $v; 
    print "$k: $v\n"; 
} 
print "Total letters in string: $total\n", 

輸出:

w: 1 
    d: 1 
    l: 3 
    o: 2 
    e: 1 
    r: 1 
    h: 1 
    Total letters in string: 10 
相關問題