我正在查看一些使用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";
}
我以前从未见过这个,我无法在任何地方找到解释。我尝试删除\
,我收到语法错误,因此需要清楚,但为什么?
答案 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:
可以通过多种方式创建参考文献。
- 对变量,子例程或值使用反斜杠运算符。 (这与C中的&(address-of)运算符非常相似。)这通常会创建对变量的另一个引用,因为它已经在符号表中引用了该变量。但是符号表引用可能会消失,并且您仍然会得到反斜杠返回的引用。
醇>
例如:
my $scalarref = \$foo;
使$scalarref
成为对现有标量变量$foo
的引用。相比之下,
my $scalarref = \my $foo;
创建一个新的标量变量$foo
,并使$scalarref
成为对它的引用,这可以更紧凑。