我继承了一个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)) {