我使用下面的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";
1条答案
按热度按时间4nkexdtk1#
首先,始终在脚本的开头添加
use strict; use warnings;
(更多或更晚)。变量仅在定义它的作用域中可见。例如,如果执行以下操作:
$var
在{ ... }
区块内可见,但之后不可见。使用use strict
时,print "2: $var\n";
将不会编译,因为$var
未在此范围内宣告。如果没有use strict
,此陈述式仍会运作,但$var
将未定义。要使这个示例正常工作,需要在与
print "2: $var\n"
相同的作用域中声明$var
:请注意我是如何编写
$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结尾处闭合)。因此,您的程式码应该是:
请注意,每次执行
$targetBank=$i;
时,$targetBank
的前一个值都会丢失。如果条件if($i =~ /u_b/)
在循环中只有一次为真,则这不是问题。否则,您可能需要使用数组而不是标量来存储多个值。此外,正如@TLP所指出的,
/u_b.*/
和/g_tq.*/
可以简化为/u_b/
和/g_tq/
。