Go Back   Velocity Reviews > Newsgroups > PERL
User Name
Password
Register FAQ Members List Calendar Search Today's Posts Mark Forums Read

Reply

PERL - Confused. Need Help!

 
Thread Tools Search this Thread
Old 07-22-2003, 02:33 PM   #1
Default Confused. Need Help!


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";
}








Cobra Pilot
  Reply With Quote
Old 07-22-2003, 04:21 PM   #2
Shawn Corey
 
Posts: n/a
Default Re: Confused. Need Help!

Hi,

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

Cobra Pilot wrote:

> 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:umper to view complex data structures:
use Data:umper;
print &Dumper( \%hash );


  Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump