循环Perl的语法

时间:2015-07-31 14:43:10

标签: perl

我继承了Perl脚本,但还没有Perl背景。脚本失败了:

syntax error at /home/assay/assay/bin/mpprimer/MPprimer/bin/MPprimer_dimer_check.pl line 181, near "$k qw(a g c t)"

这是相关代码

# create a binding array for each of the four bases
for $l (0 .. $pfl-1) {
    my $mbase = substr($fprimer_r, $l, 1);
    $primer_hash{$mbase}[$l]=1;
    for $k qw(a g c t) {
        $primer_hash{$k}[$l] ||=0;
    }
}

任何指示或建议都将不胜感激。

2 个答案:

答案 0 :(得分:8)

您可能已将Perl更新为5.18。在该版本中,qw operator was changed的行为与括号不同。来自perl5180delta

  

qw(...)不能再用作括号

     

qw列表用于欺骗   解析器认为它们总是被括号括起来。这个   允许一些令人惊讶的结构,例如foreach $x qw(a b c) {...},这应该真正写成foreach $x (qw(a b c)) {...}。   这些有时会使词法分析器进入错误的状态,所以他们   没有完全发挥作用,和那个类似的foreach qw(a b c) {...}   可能会被允许从来没有工作过。

     

这种副作用   qw现在已被废除。自Perl v5.13.11以来,它已被弃用。   现在有必要在任何地方使用真正的括号   语法要求他们。

自从Perl 5.13.11以来就出现了警告。如果您没有看到它,可能是您从早于5.14.0 * 的版本升级了,或者因为您从未查看过错误日志。

警告可能是以下内容,可在perldiag中找到(使用grep / ctrl + f)。

Use of qw(...) as parentheses is deprecated

*)Perl 5中不均匀的次要版本是指开发者版本,甚至是官方稳定版本的版本

答案 1 :(得分:4)

您需要在迭代的列表周围放置括号(在这种情况下为qw//构造):

for $k (qw(a g c t)) {