http://qs321.pair.com?node_id=10990


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)