在目录名称的开头有什么反引号? (perl的)

时间:2016-05-16 20:36:34

标签: perl

我想了解一个程序。如果我错了,请更正我,但反引号用于在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);
}

3 个答案:

答案 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,然后有条件地分配匹配并进入循环,或跳过循环(如果匹配失败并$endundef)。

按照上面文档引文中的链接,转到Performance issues

  

在Perl 5.20.0中,默认情况下启用了一个新的写时复制系统,它最终修复了这三个变量的所有性能问题,并使它们可以安全地在任何地方使用。

“三个变量”指的是$`,$&和$'。感谢stevieb这句话。

但是,我建议按照Borodin的建议使用现代工具和技术。