Mã này hoạt động:
#!/bin/perl -w
use strict;
sub PrintAA
{
my($test, %aa) = @_;
print $test . "\n";
foreach (keys %aa)
{
print $_ . " : " . $aa{$_} . "\n";
}
}
my(%hash) = ('aaa' => 1, 'bbb' => 'balls', 'ccc' => \&PrintAA);
PrintAA("test", %hash);
Điểm mấu chốt là việc sử dụng bối cảnh mảng trong tôi() 'tuyên bố' trong hàm.
Doanh nghiệp ngữ cảnh mảng thực sự làm gì?
Nhỏ gọn, nó hoạt động chính xác.
Điều đó có nghĩa là giá trị đầu tiên trong mảng đối số @_
được gán cho $test
và các mục còn lại được gán cho hàm băm %aa
. Theo cách tôi gọi, có một số mục lẻ trong số @_
, vì vậy khi mục đầu tiên được gán cho $test
, thậm chí có một số mục có sẵn để gán cho %aa
, với mục đầu tiên của mỗi cặp là ('aaa', 'bbb', 'ccc' trong ví dụ của tôi) và thứ hai là giá trị tương ứng.
Có thể thay thế %aa
bằng @aa
, trong trường hợp đó, mảng sẽ có 6 mục trong đó. Cũng có thể thay thế %aa
bằng $aa
và trong trường hợp đó, biến số $aa
sẽ chứa giá trị 'aaa' và các giá trị còn lại trong @_
sẽ bị bỏ qua bởi nhiệm vụ.
Nếu bạn bỏ qua các dấu ngoặc đơn xung quanh danh sách biến, Perl từ chối biên dịch mã. Một trong những câu trả lời thay thế cho thấy ký hiệu:
my $test = shift;
my(%aa) = @_;
Điều này tương đương với những gì tôi đã viết; sự khác biệt là sau hai câu lệnh my
, @_
chỉ chứa 6 phần tử trong biến thể này, trong khi trong một phiên bản my
duy nhất, nó vẫn chứa 7 phần tử.
Chắc chắn có các câu hỏi khác trong SO về ngữ cảnh mảng.
Trên thực tế, tôi đã không hỏi về my($test, %aa) = @_;
Tôi đã hỏi về my(%hash) = ('aaa' => 1, 'bbb' => 'balls', 'ccc' => \&PrintAA);
so my %hash = { 'aaa' => 1, ... };
Sự khác biệt là các {...} ký hiệu tạo ra một ref băm và (...) ký hiệu tạo ra một danh sách, ánh xạ tới một giá trị băm (trái ngược với hàm băm). Tương tự, [...] tạo ra một mảng ref và không phải là một mảng.
Thật vậy, hãy thay đổi mã 'chính' để đọc: my (% hash) = {...}; và bạn sẽ có được một thời gian chạy (nhưng không phải thời gian biên dịch) lỗi - số dòng điều trị một cách thận trọng kể từ khi tôi đã thêm mã khác thay thế cho tập tin của tôi:
Reference found where even-sized list expected at xx.pl line 18.
...
Use of uninitialized value in concatenation (.) or string at xx.pl line 13.
Bạn có thể hiển thị mã cho chúng tôi không? –
Bạn có thể hiển thị mã gọi cho chúng tôi không? –