Perl"\ my $ var"为什么"我的"用反斜杠逃脱了?

tjw*_*992 2 syntax perl scope perl-module perl-data-structures

我正在查看一些使用File :: Path制作和删除文件路径的示例代码.

http://perldoc.perl.org/File/Path.html

我可以让函数正常工作但我在使错误消息正常工作时遇到了一些困难.在捕获错误消息的示例中,他们使用\之前的my.这是什么目的\

# Sample code from the link above
remove_tree( 'foo/bar', 'bar/rat', {error => \my $err} );  # why escape the my?!?!
if (@$err) {
    for my $diag (@$err) {
        my ($file, $message) = %$diag;
        if ($file eq '') {
            print "general error: $message\n";
        }
        else {
            print "problem unlinking $file: $message\n";
        }
    }
}
else {
    print "No error encountered\n";
}
Run Code Online (Sandbox Code Playgroud)

我以前从未见过这个,我无法在任何地方找到解释.我尝试删除了\,我得到一个语法错误,所以很明显它是必要的,但为什么?

TLP*_*TLP 6

\my $err返回对新变量的引用$err.

remove_tree期望该error选项的值是对标量的引用.该引用告诉remove_tree应该存储错误的位置.error => my $err将传递$err(undef)的值而不是定位的方法$err.


Jon*_*ast 5

不,my比 Perl 具有更高的优先级,因此它是被应用的 \整个表达式my $err。其本身并不是真正的逃避;引用http://perldoc.perl.org/perlref.html#Making-References\\

可以通过多种方式创建参考。

  1. 通过在变量、子例程或值上使用反斜杠运算符。(这与 C 中的 &(地址)运算符非常相似。)这通常会创建另一个对变量的引用,因为符号表中已经存在对该变量的引用。但是符号表引用可能会消失,并且您仍然拥有反斜杠返回的引用。

例如:

my $scalarref = \$foo;
Run Code Online (Sandbox Code Playgroud)

引用$scalarref现有标量变量$foo。相比之下,

my $scalarref = \my $foo;
Run Code Online (Sandbox Code Playgroud)

创建一个新的标量变量$foo$scalarref对其进行引用,这样可以更紧凑。