Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
目录名开头的反勾号是什么?(perl)_Perl - Fatal编程技术网

目录名开头的反勾号是什么?(perl)

目录名开头的反勾号是什么?(perl),perl,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;

我正在努力理解一个程序。如果我错了,请纠正我的错误,但是反勾号用于在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);
}

$`
是一个与正则表达式相关的特殊变量,包含上次成功匹配之前的字符串。从

$`
最后一次成功模式匹配所匹配的内容之前的字符串,不计算当前块所包含的块或eval中隐藏的任何匹配项。
请参阅上面的性能问题,了解在代码中使用此变量(甚至一次)对性能的严重影响。
此变量是只读的,并且具有动态作用域。
助记符:`经常在带引号的字符串前面


在本例中,如果匹配发生,则它包含
$dir
中匹配的
|/foldername |
前面的字符串部分。请注意,如果没有匹配项,这行代码和条件声明将导致未定义的行为

然后,
foreach
中的代码将复制文件夹
“$dir/$folder”
一级。但是,如果匹配失败,此代码将在程序进入无效状态后运行。因此,我建议您重写它,大致如下:在单独的语句中声明
$end
,然后有条件地分配匹配并进入循环,或者跳过循环(如果匹配失败并且
$end
未定义


按照上面引用的文档中的链接,到

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

“三个变量”指的是
$\
$&
$'
。谢谢你的评论


但是,我建议遵循的建议使用现代工具和技术。

变量
$`
是一个Perl特殊变量,其“英文”名称为
$PREMATCH
。从perldoc网站:

最后一次成功模式匹配所匹配的内容之前的字符串,不计算隐藏在由当前块包围的块或eval中的任何匹配


不是很漂亮,是吗

$`
变量是
$`
$&
$'
三者中的一个,它们表示最后一个字符串中经过成功正则表达式比较的预匹配、匹配和匹配后部分

例如,如果我有

my $s = 'abcdef';
然后

$s =~ /c./;
你会发现
$`
ab
$&
cd
$'
ef

重要的是要记住,就像捕获变量
$1
$2
等一样,这三个变量不受失败的正则表达式匹配的影响。(它们没有设置为
undef
),因此在使用它们之前检查正则表达式模式是否匹配至关重要

这是过时的Perl,主要是为了向后兼容而维护的。当时这是一个好主意,因为Perl与shell语法非常接近(awk和sed也是如此,现在仍然如此)。现在最好使用正则表达式捕获,或者与较新的
-
+
数组结合使用
substr


所有特殊的内置变量都记录在

欢迎来到Perl的精彩世界!(如果您在此之前显示代码中的最后一个正则表达式匹配,我们可能会更好地解释其目的。)谢谢大家,这太快了!还请注意,
my$end=$`if$dir=~m/\/foldername/
无论如何都是非常糟糕的做法。声明和赋值都会被修改,确切的行为取决于Perl中未记录的内部结构,这些内部结构可能会发生变化。“带有语句修饰符的
my
state
our
的行为未定义”。您应该使用
my$end$end=$`if$dir=~m |/foldername |谢谢你的提示。我觉得它看起来很难看,但我不知道为什么。很感谢你提到了这场演出。您可能希望更新您的帖子,以注意到在v5.20.0中使用了写上拷贝系统,性能损失消失了@stevieb:在任何版本的Perl中,我都没有遇到过这种情况。这是语言的一大禁忌,但一旦你从磁盘上读到任何东西,它就会突然变得无关紧要。我并不建议使用
$`
——现代的方法是clearer@stevieb谢谢,添加到帖子中。然而,我完全同意博罗丁的评论和一般性建议。@zdim。我也完全同意博罗丁的观点,但我认为这是值得注意的:)@stevieb当然是的,谢谢你的夸奖。当我决定引用整段文字时,它就属于那里了。@ThisSuitesBlacknot:你从哪里学到了双倍背刻度?它比使用
元素要整洁得多。我只希望其中任何一个都能尊重前导空格和尾随空格。它似乎在注释中也不起作用:-/@Borodin它是堆栈交换(某种程度上)所坚持的一部分。我不认为有什么好方法可以让它尊重前导/尾随空格;你可以不使用空格,但这是一个可怕的黑客。注释是特殊的:您必须用反斜杠转义反斜杠,因此要获得
$`
,您必须输入
`$\`
。我不知道他们为什么决定这样实施。