Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Re: Array to Hash

by btrott (Parson)
on May 10, 2000 at 20:29 UTC ( [id://10990]=note: print w/replies, xml ) Need Help??


in reply to Array to Hash

Use a hash slice:
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};

Replies are listed 'Best First'.
RE: Re: Array to Hash
by takshaka (Friar) on May 10, 2000 at 20:35 UTC
    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;
RE: Re: Array to Hash
by httptech (Chaplain) on May 10, 2000 at 20:36 UTC
    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)
      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:)
        ...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)
      ...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)

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://10990]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (4)
As of 2024-04-25 21:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found