Perl:对“foreach”局部变量的替换更改了用于“foreach”处理的数组元素

r6l8ljro  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(158)

程式码片段:

use File::Basename;
my @powerArray;
my $powerLoc = "/home/yuerki/10.12/proj";
@powerArray = glob("$powerLoc/*") if (-e $powerLoc);
print "FIRST: @powerArray is powerArray\n";
foreach my $powerNum (@powerArray) {
    $powerNum= basename ($powerNum);
    if($powerNum =~ /power/)
    {
        $powerNum =~ s/power//g;
        $powerNum  =~ s/\n//g;
        $powerNum =~ s/^\s+|\s+$//g;
        push(@powerList,"$powerNum") if ($powerNum =~ /^\d+$/);
    }
}
print "SECOND: @powerArray is powerArray\n";

**“/home/yuerki/10.12/proj/”中的内容为:**电源1、电源2、电源3、电源4、电源5
输出:

第一个:/home/yuerki/10.12/项目/电源1/home/yuerki/10.12/项目/电源2/home/yuerki/10.12/项目/电源3/home/yuerki/10.12/项目/电源4/home/yuerki/10.12/项目/电源5是电源阵列
第二个:1 2 3 4 5是powerArray

**问题/疑问:**为什么“第二:1 2 3 4 5是否为powerArray”已进入输出?我希望它是“SECOND:/home/yuerki/10.12/proj/power 1/home/yuerki/10.12/proj/power 2/home/yuerki/10.12/proj/power 3/home/yuerki/10.12/proj/power 4/home/yuerki/10.12/proj/power 5”,因为我们在@powerArray中没有做任何更改,而只在$powerNum中做了更改。

有人能解释一下吗?还有,我怎样才能避免在@powerArray中的替换更改?因为我也需要在其他地方使用这个全局数组

fcg9iug3

fcg9iug31#

进行如下修改:

...
@powerArray = glob("$powerLoc/*") if (-e $powerLoc);
print "FIRST: @powerArray is powerArray\n";
foreach my $element (@powerArray) {
    my $powerNum = $element;
    $powerNum= basename($powerNum);
    if($powerNum =~ /power/){
...

希望这对你有帮助。

ev7lccsx

ev7lccsx2#

foreach循环将循环变量作为它的别名,而不是复制该迭代的标量。

my $y = 123;
for my $x ( $y ) {
   $x = 456;
}

say $y;  # 456

复制一份。

for ( @powerArray ) {
   my $powerNum = $_;
   ...
}

或者避免修改它。

push @powerList, basename( $powerNum ) =~ /^power(\d+)/;

相关问题