Plasterek hash będzie najwyraźniejszy sposób do mnie:
#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw/shuffle/;
use Data::Dumper;
my %h = (
this => 0,
is => 1,
a => 2,
test => 3,
);
@h{keys %h} = shuffle values %h;
print Dumper \%h;
Ma to wadę polegającą na tym, że wielkie hashe zajmują dużo pamięci, gdy wyciągniesz wszystkie swoje klucze i wartości. Bardziej wydajne (z punktu widzenia pamięci) rozwiązaniem byłoby:
#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw/shuffle/;
use Data::Dumper;
my %h = (
this => 0,
is => 1,
a => 2,
test => 3,
);
{ #bareblock to cause @keys to be garbage collected
my @keys = shuffle keys %h;
while (my $k1 = each %h) {
my $k2 = shift @keys;
@h{$k1, $k2} = @h{$k2, $k1};
}
}
print Dumper \%h;
Kod ten ma tę zaletę, tylko konieczności duplikowania klawiszy (zamiast kluczy i wartości).
Poniższy kod nie losuje wartości (z wyjątkiem Perl 5.8.1, gdzie kolejność kluczy ma charakter losowy), ale miesza zamówienie. To ma korzyści z pracy w miejscu bez zbytniego dodatkowego zużycia pamięci:
#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw/shuffle/;
use Data::Dumper;
my %h = (
this => 0,
is => 1,
a => 2,
test => 3,
);
my $k1 = each %h;
while (defined(my $k2 = each %h)) {
@h{$k1, $k2} = @h{$k2, $k1};
last unless defined($k1 = each %h);
}
print Dumper \%h;
Można zawsze stworzyć mieszania różnych skrótów, a następnie losowo wybrać jeden z tych;) – hemlocker