我正在使用遍历HoH的脚本:
for my $bp (sort { $a <=> $b } keys $vars{$chr1}){
for my $chr2 (sort keys $vars{$chr1}{$bp}){
[...]
}
}
在我的本地计算机上(运行perl v5.18.2
),这是公认的语法。但是,我担心这一部分的可移植性,因为当我在我的集群上运行它时(运行perl v5.24.0
),脚本会死掉:
现在禁止在script / mergesvs.pl上使用标量上的实验键 第66行。
据我了解,我可以通过将上述内容更改为:
来解决此问题for my $bp (sort { $a <=> $b } keys %{ $vars{$chr1} }){
for my $chr2 (sort keys %{ $vars{$chr1}{$bp} }){
[...]
}
}
但是由于我更频繁地使用以前的语法,我更倾向于在此脚本中使用与此兼容的perl版本(例如v5.18.2
)。
我尝试在脚本顶部添加use 5.18.2
,但没有任何区别。我应该在哪里指定要使用的perl版本?
或者我应该在所有代码中采用更新的样式?
答案 0 :(得分:7)
您可以使用$]
测试perl的版本,并执行以下操作:
use v5.18.2;
if ($] >= 5.024) {
die("You are using a version of Perl too new for this program");
}
... 但这是可怕的想法。你应该为将来的代码进行校对,而不是将它设计为爆炸,如果Perl太新了。
正如错误消息所说,这是一个实验性功能。结果是lots of different problems。
您应该停止使用它并返回使用显式解除引用(这不是新语法,它是新语法结果不好的原始语法)。
答案 1 :(得分:2)
您可以使用use
指定最低版本,使用no
指定最高版本。
use v5.14.0; # die if $] < 5.014 # When C<< keys EXPR >> was introduced
no v5.24.0; # die if $] >= 5.024 # When C<< keys EXPR >> was removed
no if $] >= 5.020, warnings => qw( experimental::autoderef );
但这是一个可怕的想法......昆汀说的......