Perl "my $var" 为什么 "my" 会用反斜杠转义?



我正在寻找一些使用File::P ath制作和删除文件路径的示例代码。

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: $messagen";
        }
        else {
            print "problem unlinking $file: $messagen";
        }
    }
}
else {
    print "No error encounteredn";
}

我以前从未见过这种情况,我在任何地方都找不到解释。 我尝试删除,但显然需要语法错误,但为什么呢?

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

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

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

可以通过多种方式创建引用。

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

例如:

my $scalarref = $foo;

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

my $scalarref = my $foo;

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

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

是执行此操作的简写方法:

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

$err的意思是"对$err的引用"。

相关内容

  • 没有找到相关文章

最新更新