perl 如何将foreach循环中的元素指定为变量?

js4nwp54  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(173)

我使用下面的Perl代码,并希望将foreach中的特定$i添加到变量$targetBank$targetEntry中。
对于1_目标银行和1_目标条目,它们可以打印出来。
但对于2_目标银行和2_目标条目,它们不起作用。
$targetBank$targetEntry变量似乎每次在foreach循环中都会刷新。
我应该如何修改我的代码?

my @SPLIT =split /\./, $longSentense;
foreach my $i (@SPLIT)
{
    if($i =~ /u_b.*/)
    {
        my $targetBank=$i;
        print "1_Target Bank= $targetBank\n";
    }
    elsif ($i =~ /g_tq.*/)
    {
        my $targetEntry=$i;
        print "1_Target Entry= $targetEntry\n";
    }
}

print  "2_Target Bank= $targetBank\n";
print  "2_Target Entry= $targetEntry\n";
4nkexdtk

4nkexdtk1#

首先,始终在脚本的开头添加use strict; use warnings;(更多或更晚)。
变量仅在定义它的作用域中可见。例如,如果执行以下操作:

{
    my $var = 42;
    print "1: $var\n";  # prints "1: 42"
}
print "2: $var\n"; # ERROR !!!

$var{ ... }区块内可见,但之后不可见。使用use strict时,print "2: $var\n";将不会编译,因为$var未在此范围内宣告。如果没有use strict,此陈述式仍会运作,但$var将未定义。
要使这个示例正常工作,需要在与print "2: $var\n"相同的作用域中声明$var

my $var;
{
    $var = 42;
    print "1: $var\n";  # prints "1: 42"
}
print "2: $var\n"; # prints "2: 42", as expected.

请注意我是如何编写$var = 42而不是my $var = 42的:后者将声明一个新变量(仅在此作用域中),该变量将“遮蔽”先前的声明,并且当退出该作用域时(在}处),可见的$var将是在该块之前声明的变量,该块仍未定义。
另外,“作用域”这个词可能有点混乱,你可以(大多数情况下)把作用域想象成“花括号内的所有内容+全局作用域”:if () { new scope here }for (...) { new scope here }sub { new scope here }和,所有不在块内的内容都在全局范围内。当你写if (my $var = ...) { ... }for my $var (...) { ... }时,它引入了两个作用域:一个在$var中,另一个在{ ... }中(它们都在if/for结尾处闭合)。
因此,您的程式码应该是:

use strict;   # never omit 
use warnings; # those 2 lines

my @SPLIT =split /\./, $longSentense;
my ($targetBank, $targetEntry); # Declaring your variables
foreach my $i (@SPLIT)
{
    if($i =~ /u_b/)
    {
        $targetBank=$i;
        print "1_Target Bank= $targetBank\n";
    }
    elsif ($i =~ /g_tq/)
    {
        $targetEntry=$i;
        print "1_Target Entry= $targetEntry\n";
    }
}

print  "2_Target Bank= $targetBank\n";
print  "2_Target Entry= $targetEntry\n";

请注意,每次执行$targetBank=$i;时,$targetBank的前一个值都会丢失。如果条件if($i =~ /u_b/)在循环中只有一次为真,则这不是问题。否则,您可能需要使用数组而不是标量来存储多个值。
此外,正如@TLP所指出的,/u_b.*//g_tq.*/可以简化为/u_b//g_tq/

相关问题