2012-08-31 135 views
1

我有一個@array字符串數組,我想在@array中搜索@ array2。 @ array2每行數據包含兩個元素。如何在另一個數組中搜索一個數組,然後將結果放入第三個數組中?

例如@array = ABCD

@數組2有兩列與列項:

row1: a x,  
row2: y c,  
row3: d x,  
row4: d c,  
row5: x b,  
row6: x x,  
row7: y x 

如果@array中的任何成員$是任何行,我想把@數組2的那些行改成@ ARRAY3和理想所有在一個列中,所以@ array3 = axycdxdcxb

即第6行和第7行不包含a,b,c或d,因此它們被排除! 任何幫助將是偉大的!如果你想用盡陣列

for my $member (@array) { 
    ... 
} 

,您可以在while循環使用shift

+0

你是覆蓋還是附加你放入字符串的文件?此外,您的問題變得越來越複雜,顯示了一些示例輸入以及您期望的結果。 – vol7ron

+0

當然,這取決於第二個文件的大小,但我至少會嘗試將整個文件讀入數組。找到這兩個數組的相交元素是一個更簡單的_lot_,而且代碼也更易於維護。 ) – raina77ow

+0

我已更新問題描述 - 希望現在閱讀更直接! – user1637359

回答

1

使用for循環

while (@array) { 
    my $member = shift @array; 
} 

你甚至可以縮短到

while (defined(my $member = shift @array)) { ... } 

但只有當你確定@array的所有成員是定義。

+0

使用您的最後一個建議,在我的第一個while循環將@array分配給散列我使用:'%members; ($ member =〜m /(\ w +)/){ \t $ members {$ 1} = 1;(定義(my $ member = shift @array)){ } }'但這似乎只有一個單一的輸出? – user1637359

+0

我的下一個while循環是按照原樣搜索@ array2,或者在這種情況下作爲文件:open(FILE2,$ filename2); 而(我的$ member2 = ){ \t如果($ member2 =〜米/(\ W +)/){ \t如果(存在($成員{$ 1})){ \t $ member2 = ; \t print $ member; \t} \t} \t } 接近FILE2;' – user1637359

+0

當你說使用for循環,你的意思,而不是while循環? – user1637359

0

使用數組,對於[各個]構建體可能更適合

@array=<FILE>; # in array context <FILE> returns an array instead a line 

while(@array>0) { # in scalar context @array returns the size of the array 
    my $line = shift @array; 
    ... 
} 

或保存陣列

my $i=0; 
while($i<@array) { 
    my $line = $array[$i]; 
    ... 
} continue { 
    $i++ 
} 
0

這裏的一個選項:

use Modern::Perl; 

my @array = qw/ a b c d /; 
my @array2 = ('a x', 'y c', 'd x', 'd c', 'x b', 'x x', 'y x'); 
my @array3; 

for (@array2) { 
    my @i = split; 
    push @array3, @i if $i[0] ~~ @array or $i[1] ~~ @array; 
} 

say for @array3; 

輸出:

a 
x 
y 
c 
d 
x 
d 
c 
x 
b 

for循環遍歷@array2的元素,split將字母變爲@i。 '智能匹配'運算符(Perl 5.10+)用於查看天氣中的一個或另一個字母是否在@array中包含的列表中,如果是,則將@i中的列表推送到最終打印的@array3上。

相關問題