[Perl] Strange problem with array

Hi,

I have a strange problem with arrays in Perl.
That is to say, for me it is strange and perhaps there is a special reason for it that I do not know of.
Not a real Perl Ace.

This is the program, as an example:

#!/usr/bin/perl -w #-d

use strict;

my $pu;
my $pu_list_cmd;

my @pu_list = (
"PU_0001",
"PU_0002",
"PU_0003",
"PU_0004",
"PU_0005");

printf "pu_list at the beginning: @pu_list\n";
foreach (@pu_list) {
  $pu = $_;
  printf "$pu\n";
  printf "pu_list in foreach loop: @pu_list\n";
} # End of foreach loop

printf "pu_list at the end: @pu_list\n";

printf "\n\n";

printf "pu_list at the beginning: @pu_list\n";
foreach (@pu_list) {
  $pu = $_;
  $pu_list_cmd = "echo \"$pu applied\"";
  printf "$pu";

  open (CMD, '-|', "$pu_list_cmd");
  while (<CMD>) {
    chomp;
    if ( /applied$/ ) {
      printf " ... OK.\n";
    } elsif ( /ERROR: There is no PU/ ) {
      printf " ... not installed.\n";
    }
  } # End of while loop
  close (CMD);
  printf "pu_list in foreach loop: @pu_list\n";
} # End of foreach loop

printf "pu_list at the end: @pu_list\n";

The output:

pu_list at the beginning: PU_0001 PU_0002 PU_0003 PU_0004 PU_0005
PU_0001
pu_list in foreach loop: PU_0001 PU_0002 PU_0003 PU_0004 PU_0005
PU_0002
pu_list in foreach loop: PU_0001 PU_0002 PU_0003 PU_0004 PU_0005
PU_0003
pu_list in foreach loop: PU_0001 PU_0002 PU_0003 PU_0004 PU_0005
PU_0004
pu_list in foreach loop: PU_0001 PU_0002 PU_0003 PU_0004 PU_0005
PU_0005
pu_list in foreach loop: PU_0001 PU_0002 PU_0003 PU_0004 PU_0005
pu_list at the end: PU_0001 PU_0002 PU_0003 PU_0004 PU_0005


pu_list at the beginning: PU_0001 PU_0002 PU_0003 PU_0004 PU_0005
PU_0001 ... OK.
Use of uninitialized value in join or string at ./ej.pl line 42.
pu_list in foreach loop:  PU_0002 PU_0003 PU_0004 PU_0005
PU_0002 ... OK.
Use of uninitialized value in join or string at ./ej.pl line 42.
Use of uninitialized value in join or string at ./ej.pl line 42.
pu_list in foreach loop:   PU_0003 PU_0004 PU_0005
PU_0003 ... OK.
Use of uninitialized value in join or string at ./ej.pl line 42.
Use of uninitialized value in join or string at ./ej.pl line 42.
Use of uninitialized value in join or string at ./ej.pl line 42.
pu_list in foreach loop:    PU_0004 PU_0005
PU_0004 ... OK.
Use of uninitialized value in join or string at ./ej.pl line 42.
Use of uninitialized value in join or string at ./ej.pl line 42.
Use of uninitialized value in join or string at ./ej.pl line 42.
Use of uninitialized value in join or string at ./ej.pl line 42.
pu_list in foreach loop:     PU_0005
PU_0005 ... OK.
Use of uninitialized value in join or string at ./ej.pl line 42.
Use of uninitialized value in join or string at ./ej.pl line 42.
Use of uninitialized value in join or string at ./ej.pl line 42.
Use of uninitialized value in join or string at ./ej.pl line 42.
Use of uninitialized value in join or string at ./ej.pl line 42.
pu_list in foreach loop:
Use of uninitialized value in join or string at ./ej.pl line 45.
Use of uninitialized value in join or string at ./ej.pl line 45.
Use of uninitialized value in join or string at ./ej.pl line 45.
Use of uninitialized value in join or string at ./ej.pl line 45.
Use of uninitialized value in join or string at ./ej.pl line 45.
pu_list at the end:

Can someone explain why my array is being emptied in the second foreach loop ?

Thanks in advance,

E.J.

Do it this way:

#!/usr/bin/perl -w #-d

use strict;

my $pu;
my $pu_list_cmd;

my @pu_list = (
"PU_0001",
"PU_0002",
"PU_0003",
"PU_0004",
"PU_0005");

printf "pu_list at the beginning: @pu_list\n";
foreach (@pu_list) {
  $pu = $_;
  printf "$pu\n";
  printf "pu_list in foreach loop: @pu_list\n";
} # End of foreach loop

#printf "pu_list at the end: @pu_list\n";


printf "pu_list at the beginning: @pu_list\n";
foreach $pu (@pu_list) {
  $pu_list_cmd = "echo \"$pu applied\"";
  printf "$pu";

  open (CMD, '-|', "$pu_list_cmd");
  while (<CMD>) {
    chomp;
    if ( /applied$/ ) {
      printf " ... OK.\n";
    } elsif ( /ERROR: There is no PU/ ) {
      printf " ... not installed.\n";
    }
  } # End of while loop
  close (CMD);
  printf "pu_list in foreach loop: @pu_list\n";
} # End of foreach loop

printf "pu_list at the end: @pu_list\n";

Thanks a lot !
Works now.