Na pierwsze pytanie, to zrobić w jednej linii kodu:
@$_{@keys}[email protected] for \my %h;
lub
map @$_{@keys}[email protected], \my %h;
ale tego nie zrobił; to mylący sposób, aby to napisać.
Każda z wersji deklaruje zmienną i natychmiast pobiera odwołanie do niej i przypisuje ją do referencji, tak aby odwołanie do skrótu mogło zostać użyte w wycinku. Pozwala to zadeklarować zmienną w istniejącym zakresie; @{ \my %h }{@keys} = @vals;
również "działa", ale ma niefortunną wadę z zakresu %h
do tego małego bloku w skrawku skrótu.
Dla twojego drugiego pytania, jak pokazano powyżej, plasterki mogą być używane na referencjach hash; zobacz http://perlmonks.org/?node=References+quick+reference dla niektórych łatwych do zapamiętania zasad.
my @slice = @$anonh{@fields};
czy może masz na myśli:
my $slice = [ @$anonh{@fields} ];
ale @ plaster/$ kawałek jest kopią wartości.Aby uzyskać tablicę aliasów do wartości hash, można zrobić:
my $slice = sub { \@_ }->(@$anonh{@fields});
Te jednolinijki są o wiele mniej obrzydliwe niż '$ h -> {$ a} = $ b while ($ a, $ b) = ($ ea // = Lista :: MoreUtils :: each_array (klawisze @, wartości @)) ->() 'Nad tym pracowałem. – mob
@mob: '% h = Algorytm :: Pętle :: MapCarE {@_} \ @keys, \ @values;' – ysth
Tak wiele dobrych odpowiedzi ... zaakceptował ten, ponieważ był pierwszy. :-) – mswanberg