2012-06-13 38 views
11

Tôi có hai băm, một lớn và một nhỏ. Tất cả các khóa băm nhỏ hơn hiển thị trong băm lớn hơn, nhưng các giá trị khác nhau. Tôi muốn sao chép các giá trị từ băm lớn hơn đến băm nhỏ hơn.Sao chép các giá trị từ một giá trị băm này sang một số khác trong perl

EG:

# I have two hashes like so 
%big_hash = (A => '1', B => '2', C => '3', D => '4', E => '5'); 
%small_hash = (A => '0', B => '0', C => '0'); 
# I want small_hash to get the values of big_hash like this 
%small_hash = (A => '1', B => '2', C => '3'); 

Một câu trả lời rõ ràng sẽ được lặp qua các phím của băm nhỏ, và sao chép trên các giá trị như thế này

foreach $key (keys %small_hash) { $small_hash{$key} = $big_hash{$key}; } 

Có cách nào ngắn hơn để làm điều này ?

+2

Fix mã của bạn: bảng băm đi với '()', chỉ có tài liệu tham khảo bảng băm đi với '{}'. – Lumi

+0

Rất tiếc, xin lỗi về điều đó. –

Trả lời

16
@small_hash{ keys %small_hash } = @big_hash{ keys %small_hash }; 
+0

Bạn có thể giả định rằng thứ tự 'khóa% băm' sẽ không thay đổi giữa các cuộc gọi, nhưng nó có thể được đảm bảo không? – Qtax

+1

OP đã viết: "Tôi muốn sao chép các giá trị từ băm lớn hơn thành băm nhỏ hơn". Giả sử anh ta chỉ muốn sao chép các giá trị của các khóa cũng chứa trong '% small_hash', đây là giải pháp đúng. – Lumi

+0

Có, thứ tự của 'phím' được đảm bảo không thay đổi. – mob

-2
use strict; 
my %source = (a => 1, b => 2, c => 3); 
my %target = (a => -1, x => 7, y => 9); 

# Use a hash slice for the copy operation. 
# Note this will clobber existing values. 
# Which is probably what you intend here. 
@target{ keys %source } = values %source; 

for (sort keys %target) { 
    print $_, "\t", $target{ $_ }, "\n"; 
} 
+0

Sẽ không hoạt động, nguồn có nhiều giá trị hơn và OP chỉ muốn sao chép các giá trị cho cùng một khóa. – Qtax

+0

@Qtax - Tất nhiên nó sẽ hoạt động. Số lượng giá trị trong '% source' không liên quan. Và bình luận của bạn về "cùng một thứ tự giữa các băm khác nhau" không có ý nghĩa: các bảng băm không có thứ tự. Những gì tôi nghĩ rằng bạn có thể được đề cập đến là thứ tự trong nhiệm vụ, và nó được đảm bảo là giống hệt nhau cho cả hai 'khóa' và' giá trị' trên một và cùng một bảng băm. Chạy mẫu, sau đó suy nghĩ về; và sau đó có thể đăng. – Lumi

+0

Tại sao bạn không thử nó với cùng một băm như trong OP và xem cho tự của bạn nếu bạn nhận được kết quả mong muốn. – Qtax

6

Đây là một cách bạn có thể làm điều đó:

%small = map { $_, $big{$_} } keys %small; 

Altho đó là khá tương tự như vòng lặp for.

$small{$_} = $big{$_} for keys %small; 

mapproof cho những người cần một:

my %big = (A => '1', B => '2', C => '3', D => '4', E => '5'); 
my %small = (A => '0', B => '0', C => '0'); 

%small = map { $_, $big{$_} } keys %small; 

print join ', ', %small; 

Output:

A, 1, C, 3, B, 2 
+0

Không có toán tử 'map' nào cần để sao chép các giá trị từ bảng này sang bảng khác. – Lumi

+0

@Lumi, rõ ràng là bạn không biết cách hoạt động của bản đồ. Câu trả lời này hoạt động theo yêu cầu. Ít nhất hãy thử nó trước khi bạn bắt đầu bỏ phiếu xuống. – Qtax

+0

@Lumi, bằng chứng http://ideone.com/1PjLI Vâng, cách cư xử tốt để bỏ phiếu xuống câu trả lời đúng. – Qtax

Các vấn đề liên quan