我想了解一个程序。如果我错了,请更正我,但反引号用于在shell中执行命令,因此我不确定它在以下代码中的用途是什么:
my $end = $` if $dir =~ m/\/foldername/;
foreach my $folder (@dirs_) {
my $start_from = "$dir" . "\/" . "$folder";
my $move_to = "$end" . "\/" . "$folder";
rmtree $move_to;
dircopy($start_from, $move_to);
}
答案 0 :(得分:9)
它不是很漂亮。
$`
变量是三位一体$`
,$&
和$'
之一,代表最后一个字符串的匹配前,匹配和后匹配部分这是一个成功的正则表达式比较
例如,如果我有
my $s = 'abcdef';
之后
$s =~ /c./;
您会发现$`
为ab
,$&
为cd
,$'
为ef
记住这一点非常重要,就像捕获变量$1
,$2
等一样,这三个不受失败的正则表达式匹配的影响。 (它们未设置为undef
。)因此,在使用任何正则表达式模式之前检查它是否匹配至关重要
这是古老的Perl,主要是为了向后兼容而维护。当时这是一个好主意,因为Perl保持接近shell语法(就像awk和sed一样,它仍然存在)。现在最好将正则表达式捕获,或者substr
与更新的@-
和@+
数组结合使用
所有特殊的内置变量都记录在perldoc perlvar
中答案 1 :(得分:5)
变量$`
是一个Perl特殊变量,其“英文”名称为$PREMATCH
。来自perldoc网站:
前一个成功模式匹配匹配的字符串之前的字符串,不计算当前BLOCK包含的BLOCK或eval中隐藏的任何匹配项。
答案 2 :(得分:4)
添加对可能未定义的行为和无效状态的评论。
$`
是与正则表达式相关的特殊变量,包含上一次成功匹配之前的字符串。来自perlvar
$`
在上一次成功模式匹配的匹配之前的字符串,不计算隐藏在当前BLOCK所包围的BLOCK或eval中的任何匹配。
请参阅上面的性能问题,了解在代码中使用此变量(甚至一次)的严重性能影响 此变量是只读的并且是动态范围的 助记符:`通常在引用的字符串之前。
在这种情况下,如果匹配发生,它包含$dir
中匹配|/foldername|
之前的字符串部分。请注意,如果没有匹配项,那么使用条件声明的这行代码会导致 未定义的行为 。
foreach
中的代码意味着将文件夹"$dir/$folder"
复制一级。但是,如果匹配失败,则此代码在程序进入无效状态后运行。所以我敦促你重写它,方法是:在单独的语句中声明$end
,然后有条件地分配匹配并进入循环,或跳过循环(如果匹配失败并$end
是undef
)。
按照上面文档引文中的链接,转到Performance issues
在Perl 5.20.0中,默认情况下启用了一个新的写时复制系统,它最终修复了这三个变量的所有性能问题,并使它们可以安全地在任何地方使用。
“三个变量”指的是$`,$&和$'。感谢stevieb这句话。
但是,我建议按照Borodin的建议使用现代工具和技术。