我假设这不是您的实际代码,因为如果是这样,它将不起作用:
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
}
这会将任何捕获的值存储到二维数组中。直接使用文件句柄并逐行读取是首选方法,除非出于某种原因您实际上需要将整个文件保存在内存中。