2013-10-18 46 views
1

我已經知道我可以打印所有的正則表達式匹配一氣呵成(雖然沒有分隔符)這樣的(解引用數組):分配一個變量相匹配的Perl的一個班輪

perl -e '$t="10 hello 25 moo 31 foo"; print ($t =~ /(\d+)/g) ; print "\n";' 
# 102531 

我M還知道我能得到正則表達式匹配,而命名的數組,然後分配一個單獨的比賽給一個變量:

perl -e '$t="10 hello 25 moo 31 foo"; @n=($t =~ /(\d+)/g); $o=$n[1]; print "$o\n";' 
# 25 

我也知道我可以做正則表達式,然後參考,比方說,$1

perl -e '$t="10 hello 25 moo 31 foo"; $t =~ /(\d+)/g ; $o=$1; print "$o\n";' 
# 10 

......雖然由於某些原因,$2在這裏不起作用 - 爲什麼?

我想要做的是在一行/一行(不使用指定數組)的情況下,從正則表達式分配一個特定的匹配到變量。由於上述告訴我們的正則表達式匹配的結果是一個數組,我想是這樣的成語會工作(與非關聯數組使用?):

$o = @{ ($t =~ /(\d+)/g) }[1]; 

但遺憾的是它並不:

perl -e '$t="10 hello 25 moo 31 foo"; [email protected]{ ($t =~ /(\d+)/g) }[1]; print "$o\n";' 
# 

那麼,有沒有辦法在Perl中實現正則表達式匹配數組的單行分配?

回答

3

只要改變這一點:

perl -e '$t="10 hello 25 moo 31 foo"; [email protected]{ ($t =~ /(\d+)/g) }[1]; print "$o\n";' 

到:

perl -e '$t="10 hello 25 moo 31 foo"; $o=($t =~ /(\d+)/g)[1]; print "$o\n";' 
+0

非常感謝那個@ M42--不敢相信我有多接近找到它,卻錯過了它:')乾杯! – sdaau

+0

@sdaau:不客氣。 – Toto

2

除了使用列表上的下標M42的方法,你可以使用直接分配

my (undef, $x) = $t =~ /\d+/g; 

我在這裏使用undef作爲佔位符,但您也可以使用其他變量。這種方法簡單地丟棄第一場比賽。基本上,左側的標量按照它們出現的順序從右側分配值。像這樣:

my ($one, $two, $three) = (1, 2, 3, 4); 

這裏分配將導致:$one == 1$two == 2$three == 34被丟棄。