这个Perl代码中的“@”做什么?

在这段代码片段中:
use strict;
    use warnings;
    use Data::Dumper;
    my $r = [qw(testing this thing)];

    print Dumper($r);
    foreach my $row (@({$r})
    {
        print "$row\n";
        $row .= 'mod';
    }
    print Dumper($r);
    print Dumper(@({$r});

我发现'(‘之后的’@’在foreach中导致这不能正确循环,我不知道为什么这个代码甚至没有结束括号,这是什么呢?它在做什么?一个新的变量在飞行,但不应该“使用严格”已经开火或什么?

请帮忙解释一下“@(”正在做什么,为什么它仍然运行没有一个圆括号.

解决方法

这是%(变量)的哈希片段,它是*(glob的一部分),不受严格的vars的限制,对于Perl已经预定义的变量(在这种情况下为$)(也是所有其他的全部位置)所有标点符号变量在所有包中都是全局的,其全限定名称是简写形式:$),@),%),&)…由于严格的“vars”不适用于完全限定名称,这些名称都不是错误.

扩大一点:

@({$r};
@{(}{$r};
@{'main::('}{$r};  # needs strict refs to be off

这些行都是等价的.

使用警告; perl会让你知道用$sigil写一个单一值的片段会更好:

$({$r};
${(}{$r};
${'main::('}{$r};  # needs strict refs to be off

哪个在尝试解决错字时会指出你在正确的地方.这就是为什么你应该始终使用警告和限制.

有关更多详细信息,perlvar手册页将显示至少有一个sigil或所有标点符号变量.如果您想要一个关于标点符号变量范围的参考,那么package文档就是这样.

所有的标点符号变量也只能用于一次警告,这可能是一个错误

相关文章

忍不住在 PerlChina 邮件列表中盘点了一下 Perl 里的 Web 应用框架(巧的是 PerlBuzz 最近也有一篇相关...
bless有两个参数:对象的引用、类的名称。 类的名称是一个字符串,代表了类的类型信息,这是理解bless的...
gb2312转Utf的方法: use Encode; my $str = "中文"; $str_cnsoftware = encode("utf-8...
  perl 计算硬盘利用率, 以%来查看硬盘资源是否存在IO消耗cpu资源情况; 部份代码参考了iostat源码;...
1 简单变量 Perl 的 Hello World 是怎么写的呢?请看下面的程序: #!/usr/bin/perl print "Hello W...
本文介绍Perl的Perl的简单语法,包括基本输入输出、分支循环控制结构、函数、常用系统调用和文件操作,...