Confused. Need Help!

C

Cobra Pilot

I can't figure out why these three snippits of code are not equivalent..
Can someone show me the correct way to do this... (Cut and paste sample code
follows).

@tbl is array of array refs:

This works like I want it to:
foreach (@tbl) {
my $key = shift @$_;
$hash{$key} = [@$_];
}

This duplicates the key:
foreach (@tbl) {
$hash{shift @$_} = [@$_];
}

And why can't I say (produces only last entry; I know this is the
define/init syntax, isn't there an append flavor like .= ?)
foreach (@tbl) {
%hash = (shift @$_ => [@$_]);
}

--- Test program follows: ----

#!/usr/bin/perl -w
use strict;

my @tbl = (
[ "Larry Wall", "Perl Author", "555-0101" ],
[ "Tim Bunce", "DBI Author", "555-0202" ],
[ "Randal Schwartz", "Guy at Large", "555-0303" ],
[ "Doug MacEachern", "Apache Man", "555-0404" ]
);

my %hash = ();


# this doesn't work
foreach (@tbl) {
$hash{shift @$_} = [@$_];
}

foreach (keys %hash) {
print $_, "=>", join " ", @{$hash{$_}}, "\n";
}


@tbl = (
[ "Larry Wall", "Perl Author", "555-0101" ],
[ "Tim Bunce", "DBI Author", "555-0202" ],
[ "Randal Schwartz", "Guy at Large", "555-0303" ],
[ "Doug MacEachern", "Apache Man", "555-0404" ]
);

%hash = ();

# this works
foreach (@tbl) {
my $key = shift @$_;
$hash{$key} = [@$_];
}

foreach (keys %hash) {
print $_, "=>", join " ", @{$hash{$_}}, "\n";
}
 
S

Shawn Corey

Hi,

First, all of the snippets modify @tbl, or rather, the arrays referenced
in @tbl.

Cobra said:
I can't figure out why these three snippits of code are not equivalent..
Can someone show me the correct way to do this... (Cut and paste sample code
follows).

@tbl is array of array refs:

This works like I want it to:
foreach (@tbl) {
my $key = shift @$_;
$hash{$key} = [@$_];
}
The expression [@$_] can be replaced with simply $_.
This duplicates the key:
foreach (@tbl) {
$hash{shift @$_} = [@$_];
}
The array [@$_] is created first, the @$_ is shifted. This means the
array [@$_] is not shifted. If you use $_ instead of [@$_], you get what
you want.
And why can't I say (produces only last entry; I know this is the
define/init syntax, isn't there an append flavor like .= ?)
foreach (@tbl) {
%hash = (shift @$_ => [@$_]);
}
Try: %hash = ( %hash, shift @$_ => $_ );
That's the best I can think of.

BTW, you can use Data::Dumper to view complex data structures:
use Data::Dumper;
print &Dumper( \%hash );
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,022
Latest member
MaybelleMa

Latest Threads

Top