2010-06-02 11 views

Antwort

21
%hash = map { $arr[$_] => $_ } 0..$#arr; 

print Dumper(\%hash) 
$VAR1 = { 
      'Field4' => 4, 
      'Field2' => 2, 
      'Field5' => 3, 
      'Field1' => 1, 
      'Field3' => 0 
     }; 
19
my %hash; 
@hash{@arr} = 0..$#arr; 
+1

nette eins. Perl überrascht mich nach so vielen Jahren immer wieder :) – unbeli

+3

Es ist schade, dass '% hash' vorher deklariert werden muss, also können wir nicht schreiben wie' my @hash {@arr} = 0 .. $ # arr; '... – Zaid

+4

@Zaid Es gibt immer nette Tricks wie' @ $ _ {@ arr} = 0 .. $ # arr für \ my% hash; ', aber Eugens Code hat weniger Schockwert. –

2

In Perl 5.12 und später können Sie each auf einem Array verwenden, seinen Index/Wert-Paare iterieren:

use 5.012; 

my %hash; 

while(my ($index, $value) = each @arr) { 
    $hash{$value} = $index; 
} 
3

Hier ist eine weitere Möglichkeit, ich dies zu tun denken kann:

sub get_bumper { 
    my $i = 0; 
    sub { $i++ }; 
} 

my $bump = get_bumper;   # $bump is a closure with its very own counter 
map { $_ => $bump->(); } @arr; 

Wie bei vielen Dingen, die Sie in Perl tun können: Seien Sie nicht tun Dies. :) Wenn die Reihenfolge der Werte, die Sie zuweisen müssen, komplexer ist (z. B. 0, 1, 4, 9, 16 ... oder eine Folge von Zufallszahlen oder von einer Pipe gelesenen Zahlen), ist es einfach, diesen Ansatz anzupassen es, aber es ist in der Regel noch einfacher, nur unbeli's approach zu verwenden. Der einzige Vorteil dieser Methode besteht darin, dass sie eine saubere Möglichkeit bietet, willkürliche Lazy-Folgen von Zahlen bereitzustellen und zu konsumieren: Eine Funktion, die eine vom Aufrufer angegebene Sequenz von Zahlen benötigt, kann eine Coderef als Parameter nehmen und sie wiederholt aufrufen Nimm die Zahlen.

+2

Warum nicht nur 'my $ i; my% hash = map {$ _ => $ i ++} @ arr' –

+0

@ eugeney: Ja, das ist viel einfacher :) –