$1
是什么?它是匹配(\d+)
的结果吗?
$line =~ /^(\d+)\s/;
next if(!defined($1) ) ;
$paperAnnot{$1} = $line;
您说得对,$1
表示第一个捕获组,在您的示例中是(\d+)
是的!这是一组匹配。看到里面的next
,它可能在循环中。但是,更好的方法是使用条件语句并测试正则表达式:
if ( $line =~ /^(\d+)\s/ ) {
$paperAnnot{$1} = $line;
}
或者更好的方法是,给$1取一个名称,使其自我记录:
if ( $line =~ /^(\d+)\s/ ) {
my $index = $1;
$paperAnnot{$index} = $line;
}
此外,您可以在perldoc perlvar中找到更多关于$1
及其类似的信息。
现在,在 Perl 5.10 及更高版本中,您可以使用命名捕获组:
use 5.010; # or newer
...
if ( $line =~ /^(?<linenum>\d+)\s/ ) {
$paperAnnot{ $+{linenum} } = $line;
}
了解更多关于命名捕获组的内容,请查看 perldoc perlre。
是的,任何在括号中捕获的内容都会被分配给$1、$2、$3等魔术变量。如果正则表达式不匹配,则它们将为未定义。
perldoc perlvar
中还有一些更有趣的信息。// 没有注意到已经建议这样做了。 - ZyX