我使用的是在《科学》杂志上发表的工具,但由于我对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'的。

10-05 18:35
查看更多