Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl"\我的$var";为什么是";我的";用反斜杠逃跑?_Perl_Syntax_Scope_Perl Module_Perl Data Structures - Fatal编程技术网

Perl"\我的$var";为什么是";我的";用反斜杠逃跑?

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 (@

我正在看一些使用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 (@$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
<代码>\本身并不是真正的逃避;引述:

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

  • 通过对变量、子例程或值使用反斜杠运算符。(这与C中的&(address of)操作符非常相似。)这通常会创建对变量的另一个引用,因为符号表中已经有对变量的引用。但是符号表引用可能会消失,并且您仍然拥有反斜杠返回的引用
  • 例如:

    my $scalarref = \$foo;
    
    $scalarref
    作为对现有标量变量
    $foo
    的引用。相比之下

    my $scalarref = \my $foo;
    
    创建一个新的标量变量
    $foo
    ,并将
    $scalarref
    作为对它的引用,这样可以更紧凑