Perl"\我的$var";为什么是";我的";用反斜杠逃跑?
我正在看一些使用file::Path生成和删除文件路径的示例代码 我可以让函数正常工作,但我在让错误消息正常工作时遇到了一些困难。在捕获错误消息的示例中,他们在Perl"\我的$var";为什么是";我的";用反斜杠逃跑?,perl,syntax,scope,perl-module,perl-data-structures,Perl,Syntax,Scope,Perl Module,Perl Data Structures,我正在看一些使用file::Path生成和删除文件路径的示例代码 我可以让函数正常工作,但我在让错误消息正常工作时遇到了一些困难。在捕获错误消息的示例中,他们在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 (@
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";
}
我以前从未见过这种情况,我在任何地方都找不到解释。我试图删除
\
,但我得到了一个语法错误,很明显这是必需的,但为什么?\my$err
返回对新变量$err
的引用
remove_tree
希望error
选项的值是对标量的引用。参考告诉remove_tree
错误应该存储在哪里error=>my$err
将传递$err
(未定义)的值,而不是定位$err
的方法
remove_tree( 'foo/bar', 'bar/rat', {error => \my $err} );
这是一种简单的方法:
my $err;
remove_tree( 'foo/bar', 'bar/rat', {error => \$err} );
\$err
表示“引用$err
”否,my
的优先级高于Perl中的\
,因此\
应用的是整个表达式my$err
<代码>\本身并不是真正的逃避;引述:
可以通过多种方式创建引用
my $scalarref = \$foo;
将$scalarref
作为对现有标量变量$foo
的引用。相比之下
my $scalarref = \my $foo;
创建一个新的标量变量$foo
,并将$scalarref
作为对它的引用,这样可以更紧凑