2013-07-31 28 views
3

我想下面的陣列中找到名稱tank2,所以我做如何在數組上使用正則表達式?

#!/usr/bin/perl                       
use strict; use warnings; 

my @out = ("aaa\n", "pool: tank2\n", "ccc\n"); 
foreach my $line (@out) {$line =~ /pool: (.+)/; print $1;} 

,並得到

Use of uninitialized value $1 in print 
tank2tank2 

我的兩個問題是

  • 出於某種原因,這個名字打印兩次並出現錯誤。
  • 如何在第一次找到變量時將結果/名稱保存在變量中?
+1

一個字:grep的。 – m0skit0

+2

而不是'{$ line =〜/ pool:(。+)/;打印$ 1;}'say'{$ line =〜/ pool:(。+)/ && print $ 1;}' – devnull

+1

絕對不要使用'$ 1','$ 2'和朋友。 –

回答

3

相當不可讀版本:)

#!/usr/bin/perl                       
use strict; use warnings; 

my @out = ("aaa\n", "pool: tank2\n", "ccc\n"); 
(my $var = (grep{/pool: (.+)/}@out)[0])=~s/pool: //; 
print $var; 

和你的改進版:

#!/usr/bin/perl                       
use strict; use warnings; 

my @out = ("aaa\n", "pool: tank2\n", "ccc\n"); 
for my $line (@out) { 
    print $1 if $line =~ /pool: (.+)/; 
} 

並沒有$1

my $var; 
    for my $line (@out){ 
     print $var if ($var) = ($line =~ /pool: (.+)/); 
    } 
+0

+1,第三種解決方案是最好的風格。 – daxim

1
my @out = ("aaa\n", "pool: tank2\n", "ccc\n"); 
foreach my $line (@out) {if ($line =~ m/pool: (.+)/) { print $1;}} 

請注意,你不會在年底收到\n,所以你必須自己打印。

相關問題