Re: Array to Hash
by btrott (Parson) on May 10, 2000 at 20:29 UTC
|
my @array = qw/foo bar baz quux/;
my %hash;
@hash{@array} = (1) x @array;
If you don't care about the keys having values, but just
want them to exist, you can just do:
@hash{@array} = ();
But now you need to test for existence in the hash by
using exists:
print "foo is there" if exists $hash{foo};
| [reply] [d/l] [select] |
|
A hash slice is by far the coolest and most Perlish
(and as httptech points out, the fastest) method,
but foreach is the most popular.
$hash{$_}++ for @array;
| [reply] [d/l] |
|
Very cool, btrott. And faster than mine:
use Benchmark;
my @array = qw(a b c d e f g h i j k l m n o p q r s t u v w z y z);
my %hash;
timethese(500000, {
'btrott' => sub {
@hash{@array} = (1) x @array;
},
'httptech' => sub {
for (@array) { $hash{$_} = 1 }
},
});
Benchmark: timing 500000 iterations of btrott, httptech...
btrott: 14 wallclock secs (14.58 usr + 0.00 sys = 14.58 CPU)
httptech: 20 wallclock secs (20.68 usr + 0.01 sys = 20.69 CPU)
| [reply] [d/l] |
|
While we're on the topic of benchmarking, I'd just like to,
for the hell of it, add the worst possible answer to this
question:
map { $code .= "\$hash{$_} = 1;\n" } @array; eval "$code";
And now for a little program, borrowed from httptech:
use Benchmark;
my @array = qw(a b c d e f g h i j k l m n o p q r s t u v w z y z);
my %hash;
timethese(10000, {
'btrott' => sub {
@hash{@array} = (1) x @array;
},
'plaid' => sub {
my $code
map { $code .= "\$hash{$_} = 1;\n" } @array;
eval "$code";
}
});
Outputs
Benchmark: timing 10000 iterations of btrott, plaid...
btrott: 1 wallclock secs ( 0.56 usr + 0.00 sys = 0.56 CPU)
plaid: 23 wallclock secs (22.07 usr + 0.06 sys = 22.13 CPU)
Don't know why i threw this in. Guess I just didn't want
to waste the effort:) | [reply] [d/l] [select] |
|
|
...and my old friend 'grep'
Not quite as fast as btrott but still a decent contender.
use Benchmark;
my @array = qw(a b c d e f g h i j k l m n o p q r s t u v w z y z);
my %hash;
timethese(
500000,
{
'btrott' => sub {
@hash{@array} = (1) x @array;
},
'httptech' => sub {
for (@array) { $hash{$_} = 1 }
},
'danimal' => sub {
grep { $hash{$_}++ } @array;
}
},
);
Benchmark: timing 500000 iterations of btrott, danimal, httptech...
btrott: 21 wallclock secs (21.38 usr + 0.00 sys = 21.38 CPU)
danimal: 22 wallclock secs (22.57 usr + 0.00 sys = 22.57 CPU)
httptech: 34 wallclock secs (34.10 usr + 0.00 sys = 34.10 CPU)
| [reply] [d/l] |
Re: Array to Hash
by zodiac (Beadle) on May 10, 2000 at 20:54 UTC
|
%hash = map { $_=> 1} @array;
| [reply] [d/l] |
Re: Array to Hash
by BBQ (Curate) on May 10, 2000 at 20:33 UTC
|
foreach (@ary) {$hash{$_} = 1; }
Will this do?
#!/home/bbq/bin/perl
# Trust no1!
| [reply] [d/l] |
Re: Array to Hash
by httptech (Chaplain) on May 10, 2000 at 20:29 UTC
|
for (@array) { $hash{$_} = 1 } is how I'd do it. | [reply] [d/l] |
Re: Array to Hash
by plaid (Chaplain) on May 10, 2000 at 20:38 UTC
|
map { $hash{$_} = 1 } @array;
| [reply] [d/l] |
|
no. no map in void context please. That's what you have the backwards foreach for.
$item{$_} = 1 for @list;
| [reply] [d/l] |
|
What is so bad about map in map in void context ?
I mean no harm can be done, can it ?
| [reply] |
|
Re: Array to Hash
by Jonathan (Curate) on May 11, 2000 at 13:42 UTC
|
Well, well, well. There's more than one way to do it what a surprise :-) | [reply] |