gpt4 book ai didi

regex - 为什么即使 $foo 匹配模式, `return $foo if/pattern/;` 也不返回 $foo?

转载 作者:行者123 更新时间:2023-12-05 00:17:37 26 4
gpt4 key购买 nike

我正在使用发表在一篇科学文章中的工具,但它给我带来了很多麻烦,因为我对 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'在变量 $_ – 但来自调用 sub 的范围。至少可以说,这不是一个好的做法,而且很容易导致细微的错误。每当调用范围内的代码发生更改时,都必须查看 subs,但我们不会通过 sub 的接口(interface)收到警告( $_ 不是参数)。此外,这甚至不是必需的,因为调用代码可以检查和调节调用。

我宁愿相信你展示的是一个简单的错误,在这种情况下它应该是
return $equa if $equa =~ /\@BOUNDARY/;

这意味着子程序首先检查输入是否已经有这个,如果有,它只是返回它。其余显示的代码支持这一点——这就是 '@BOUNDARY' .

关于regex - 为什么即使 $foo 匹配模式, `return $foo if/pattern/;` 也不返回 $foo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39778048/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com