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

时间:2014-12-08 20:03:18

标签: perl syntax 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";
}

我以前从未见过这个,我无法在任何地方找到解释。我尝试删除\,我收到语法错误,因此需要清楚,但为什么?

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

remove_tree( 'foo/bar', 'bar/rat', {error => \my $err} );

是这样做的简便方法:

my $err;
remove_tree( 'foo/bar', 'bar/rat', {error => \$err} );

\$err表示"对$err"的引用。

答案 2 :(得分:4)

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

  

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

     
      
  1. 对变量,子例程或值使用反斜杠运算符。 (这与C中的&(address-of)运算符非常相似。)这通常会创建对变量的另一个引用,因为它已经在符号表中引用了该变量。但是符号表引用可能会消失,并且您仍然会得到反斜杠返回的引用。
  2.   

例如:

my $scalarref = \$foo;

使$scalarref成为对现有标量变量$foo的引用。相比之下,

my $scalarref = \my $foo;

创建一个新的标量变量$foo,并使$scalarref成为对它的引用,这可以更紧凑。