我使用的是在《科学》杂志上发表的工具,但由于我对Perl不太熟悉,这给我带来了很多麻烦。
该代码包含:
return $equa if /\@BOUNDARY/;
我认为,如果代码包含文本
$equa
,则该代码应该返回@BOUNDARY
,但不会这样做。提供的代码是否有错误?我正在考虑将其更改为:
if ($equa =~ /\@BOUNDARY/) {
return $equa;
}
它执行相同的功能吗?
供参考,原始代码中的整个函数为:
sub correctBoundaryReac {
my $equa = shift;
print $equa;
return $equa if /\@BOUNDARY/;
my( $left, $arrow, $right ) = ( '', '', '' );
if( $equa =~ /^(<--|<==>|-->) (.+)/ ){
$arrow = $1;
$right = $2;
$left = $right;
$left =~ s/\@\S+/\@BOUNDARY/g;
}
elsif( $equa =~ /(.+) (<--|<==>|-->)$/ ){
$left = $1;
$arrow = $2;
$right = $left;
$right =~ s/\@\S+/\@BOUNDARY/g;
}
else{
die "Don't know how to fix bounadry reaction: $equa\n";
}
return "$left $arrow $right";
}
最佳答案
如前所述,if (/$pattern/)
表示if ($_ =~ /$pattern/
。请参见General Variables in perlvar。然后的问题是–您显示的代码中$_
中有什么?
Perl中的许多内置函数和运算符默认使用$_
。但是据我所知,子例程不对任何内容使用$_
。 @_
获取参数,但这是一个完全不同的变量。
但是,在子内部,可以看到子包围范围内的$_
use feature 'say';
sub show_it { say "I see: $_" }
for ('a'..'c') {
show_it(); # prints with a through c
}
如果您所显示的代码中有此目的,则意味着该子检查变量
'@BOUNDARY'
中的模式$_
–但从调用子的范围开始。至少可以这样说,这不是一个好习惯,并且很容易导致细微的错误。每当调用范围中的代码更改时,都必须检查subs,但是我们不会通过sub的界面来警告它($_
不是参数)。此外,这甚至是不需要的,因为调用代码可以检查并确定调用条件。我宁愿相信您显示的是一个简单的错误,在这种情况下应该是
return $equa if $equa =~ /\@BOUNDARY/;
这意味着子程序首先检查输入是否已经具有该输入,如果输入已经返回,则将其返回。所显示的其余代码均支持此功能-都是关于
'@BOUNDARY'
的。