我認爲這是不實際的代碼,因爲如果是這樣,它不會工作:
foreach my $line (split("\n", $file)) {
if ($line =~ /^(\S+)\s*(\S+)\s*(\S+)$/) {
my ($val1, $val2, $val3) = ($1, $2, $3);
}
# all the $valX variables are now out of scope
}
你也應該知道,\s*
也將匹配空字符串,並可能導致細微的錯誤。例如:
"a bug" =~ /^(\S+)\s*(\S+)\s*(\S+)$/;
# the captures are now: $1 = "a"; $2 = "bu"; $3 = "g"
即使盡管\S+
是貪婪的,錨^ ... $
將迫使正則表達式來適應,因此允許空字符串分割的話。
如果您的意圖是捕獲由空格分隔的所有單詞,那麼使用split
是您的最佳選擇,正如其他人已經提到的那樣。
open my $fh, "<", "file.txt" or die $!;
my @stored;
while (<$fh>) {
my @vals = split;
push(@stored, \@vals) if @vals; # ignore empty values
}
這會將任何捕獲的值存儲到二維數組中。直接使用文件句柄和逐行讀取是首選方法,除非由於某種原因,您實際上需要將整個文件存儲在內存中。
來源
2012-04-18 15:16:57
TLP
http://stackoverflow.com/questions/2304577/how-can-i-store-regex-captures-in-an-array-in-perl? – Scroog1 2012-04-18 14:47:39
我總是喜歡http://stackoverflow.com/questions/874915/perl-extracting-data-from-text-using-regex他們使用拆分 - 你的正則表達式似乎是一個候選人。 – Konerak 2012-04-18 14:47:41