Đối với câu hỏi đầu tiên của bạn, để làm điều đó trong một dòng mã:
@$_{@keys}[email protected] for \my %h;
hoặc
map @$_{@keys}[email protected], \my %h;
nhưng tôi sẽ không làm điều đó; đó là một cách khó hiểu để viết nó.
Hoặc phiên bản tuyên bố biến và ngay lập tức tham chiếu đến biến đó và bí danh $_
để tham chiếu để tham chiếu băm có thể được sử dụng trong một lát. Điều này cho phép bạn khai báo biến trong phạm vi hiện có; @{ \my %h }{@keys} = @vals;
cũng "hoạt động", nhưng có nhược điểm đáng tiếc là phạm vi %h
cho khối nhỏ đó trong lát băm.
Đối với câu hỏi thứ hai của bạn, như được hiển thị ở trên, các lát có thể được sử dụng trên các tham chiếu băm; xem http://perlmonks.org/?node=References+quick+reference để biết một số quy tắc dễ nhớ.
my @slice = @$anonh{@fields};
hoặc có thể bạn có nghĩa là:
my $slice = [ @$anonh{@fields} ];
nhưng @ lát/$ lát có một bản sao của các giá trị.Để có được một loạt các bí danh cho các giá trị băm, bạn có thể làm:
my $slice = sub { \@_ }->(@$anonh{@fields});
Một lớp lót đó ít hơn nhiều so với giá trị $ {-> {$ a} = $ b trong khi ($ a, $ b) = ($ ea // = Danh sách :: MoreUtils :: each_array (@ phím, @ giá trị)) ->() 'Tôi đã làm việc trên. – mob
@mob: '% h = Thuật toán :: Vòng lặp :: MapCarE {@_} \ @keys, \ @values;' – ysth
Rất nhiều câu trả lời hay ... chấp nhận câu trả lời này vì nó là lần đầu tiên. :-) – mswanberg