Thread Syntax Zugriff Array Index
(23 answers)
Opened by bianca at 2019-08-11 08:23 2019-08-11T22:29:39 FIFOmap (und grep) in leerem Kontext gelten ja auch als etwas anrüchig, weil man sich "nur" der Nebeneffekte bedient. Und weil man's deswegen manchmal falsch macht. So wie ich hier: Einfach die Zuweisung wegzulassen funktioniert so nicht. Peinlich, peinlich. Richtig wäre es beispielsweise so: Ich habe nochmal eine korrigierte Version erstellt, die auch eine einzeilige Version von Biancas Original enthält. Hash::Ordered habe ich nicht mit aufgenommen, weil dabei der Aufbau des Hashes zehnmal so lang braucht als der Schleifendurchlauf. Das lohnt sich erst bei mehr als einem Dutzend Zugriffe auf den Hash. Hier die Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 use strict; use warnings; use Benchmark ('timethese'); my $size = 10000; my @stats = map { [ "a$_" => 0] } (0..$size); sub rewrite_array { @stats = map { $_->[0] eq 'a3333' ? [$_->[0], $_->[1] + 1] : $_ } @stats; } sub loop { for my $item ( @stats ) { $item->[1]++ if $item->[0] eq 'a3333'; } } sub void_array { map { $_->[0] eq 'a3333' and $_->[1]++ } @stats; } sub grepper { (grep {$_->[0] eq 'a3333'} @stats)[0]->[1]++; } timethese (10000, { '1. Array neu erstellen ' => \&rewrite_array, '2. Schleife ausformuliert ' => \&loop, '3. Array im leeren Kontext' => \&void_array, '4. Original einzeilig ' => \&grepper, }); print "a3333 ist nun $stats[3333][1]"; Code: (dl
)
1 1. Array neu erstellen : 13 wallclock secs (13.16 usr + 0.00 sys = 13.16 CPU) @ 759.88/s (n=10000) |