Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I was trying to 'store' and 'retrieve' a list, and would like to know how get to the next element. I thought I had the idea, but I appear to be missing something....
#!/bin/perl -w use Data::Dumper; use Storable; %list = ( [ "'NEIS.IFMS.CP2#LOAD.CHGT.DAT'" => 0, "sqlload / ifmschgt.dat >> ifmschgt.log" => 0 ], [ "'NEIS.IFMS.CP2#LOAD.TOLT.DAT'" => 0, "sqlload / ifmstolt.dat >> ifmstolt.log" => 0 ] ); print Dumper %list; store( \%list, 'store' ); $root = retrieve( 'store' ); foreach $line ( %{$root} ) { print Dumper $line; } foreach $line ( %{$root} ) { foreach $m ( @{$line} ) { print "$m\n"; } }

Replies are listed 'Best First'.
RE: Going through a retrieved Hash list
by Russ (Deacon) on Aug 02, 2000 at 02:00 UTC
    Let me address a few problems, here. In your code, %list has as its key an anonymous array reference. This is almost always not what you want. The square brackets are creating two array refs of four elements each. You just want to remove the square brackets, and all will be well.

    In your two loops, you are getting arrayrefs (because of the issue above) from the hash, so you are going through some contortions to get at the data.

    #!/bin/perl -w %list = ( "'NEIS.IFMS.CP2#LOAD.CHGT.DAT'" => 0, "sqlload / ifmschgt.dat >> ifmschgt.log" => 0, "'NEIS.IFMS.CP2#LOAD.TOLT.DAT'" => 0, "sqlload / ifmstolt.dat >> ifmstolt.log" => 0 ); foreach $key (keys %list) { print "$list{$key}\n"; }
    This prints four zeroes, which is what it looks like your code was intended to do.

    Russ
    Brainbench 'Most Valuable Professional' for Perl

RE: Going through a retrieved Hash list
by steveAZ98 (Monk) on Aug 02, 2000 at 00:14 UTC
    It seems to me that your trying to store a list as a hash, so when you print out $m you only get one item, the first item, since that is the key of your hash. If you change it to an array you get both items.
    my @list = ( [ "'NEIS.IFMS.CP2#LOAD.CHGT.DAT'" => 0, "sqlload / ifmschgt.dat >> ifmschgt.log" => 0 ], [ "'NEIS.IFMS.CP2#LOAD.TOLT.DAT'" => 0, "sqlload / ifmstolt.dat >> ifmstolt.log" => 0 ], ); store( \@list, 'store' ); my $root = retrieve( 'store' ); foreach my $line ( @{ $root } ) { foreach my $m ( @{ $line } ) { print $m, "\n"; } }
    HTH