Perl for循环语法



我继承了一个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;
    }
}

您可能已将Perl更新到5.18。在该版本中,qw操作符的行为被更改为不像括号那样。从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中不稳定的小版本指的是开发版本,甚至是官方稳定版本

您需要在要迭代的列表(本例中为qw//结构)周围加上括号:

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

最新更新