2013-07-24 27 views
9

Tôi thích lát băm và sử dụng chúng thường xuyên:Anonymous Hash Slices - cú pháp?

my %h; 
@h{@keys}[email protected]; 

Hoạt động rực rỡ! Nhưng có 2 điều luôn làm tôi bực tức.

Đầu tiên, có thể kết hợp 2 dòng ở trên thành một dòng mã không? Nó sẽ là tốt đẹp để tuyên bố băm và cư nó tất cả cùng một lúc.

Thứ hai, là nó có thể cắt một băm vô danh hiện có ... cái gì đó như:

my $slice=$anonh->{@fields} 

Trả lời

8

Đố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}); 
+0

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

+0

@mob: '% h = Thuật toán :: Vòng lặp :: MapCarE {@_} \ @keys, \ @values;' – ysth

+0

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

3

cú pháp Hash lát là

@ <hash-name-or-hash-ref> { LIST } 

Khi bạn đang cắt một tham chiếu băm, đặt nó bên trong các dấu ngoặc nhọn sao cho nó không bị dereferenced như một mảng. Điều này cung cấp cho bạn:

my @values = @{$anonh}{@fields} 

để tham chiếu băm $anonh.

8
  • Trước câu hỏi:

    my %h = map { $keys[$_] => $vals[$_] } 0..$#keys; 
    

    hoặc

    use List::MoreUtils qw(mesh); 
    
    my %h = mesh @keys, @vals; 
    
  • Câu hỏi thứ hai:

    Nếu đó là ...NAME... cho một băm, nó ...{ $href }... cho một ref băm, vì vậy

    my @slice = @hash{@fields}; 
    

    my @slice = @{ $anonh }{@fields}; 
    

    Các curlies là không bắt buộc nếu các biểu hiện tham chiếu là một biến.

    my @slice = @$anonh{@fields}; 
    
Các vấn đề liên quan