我正在寻找一些使用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
可以通过多种方式创建引用。
- 通过对变量、子例程或值使用反斜杠运算符。(这很像 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
的引用"。