Perl - Tài liệu tham khảo
Tham chiếu Perl là một kiểu dữ liệu vô hướng giữ vị trí của một giá trị khác có thể là vô hướng, mảng hoặc băm. Vì tính chất vô hướng của nó, một tham chiếu có thể được sử dụng ở bất cứ đâu, một đại lượng vô hướng có thể được sử dụng.
Bạn có thể xây dựng danh sách chứa các tham chiếu đến các danh sách khác, có thể chứa các tham chiếu đến hàm băm, v.v. Đây là cách các cấu trúc dữ liệu lồng nhau được xây dựng trong Perl.
Tạo tài liệu tham khảo
Dễ dàng tạo tham chiếu cho bất kỳ biến, chương trình con hoặc giá trị nào bằng cách đặt trước nó bằng dấu gạch chéo ngược như sau:
$scalarref = \$foo;
$arrayref = \@ARGV;
$hashref = \%ENV;
$coderef = \&handler;
$globref = \*foo;
Bạn không thể tạo tham chiếu trên xử lý I / O (xử lý tệp hoặc xử lý dirhandle) bằng cách sử dụng toán tử dấu gạch chéo ngược nhưng tham chiếu đến một mảng ẩn danh có thể được tạo bằng cách sử dụng dấu ngoặc vuông như sau:
$arrayref = [1, 2, ['a', 'b', 'c']];
Theo cách tương tự, bạn có thể tạo tham chiếu đến hàm băm ẩn danh bằng cách sử dụng dấu ngoặc nhọn như sau:
$hashref = {
'Adam' => 'Eve',
'Clyde' => 'Bonnie',
};
Tham chiếu đến một chương trình con ẩn danh có thể được tạo bằng cách sử dụng sub không có tên phụ như sau:
$coderef = sub { print "Boink!\n" };
Tham khảo ý kiến
Tham chiếu trả về giá trị từ một điểm tham chiếu đến vị trí. Để bỏ qua một tham chiếu, chỉ cần sử dụng $, @ hoặc% làm tiền tố của biến tham chiếu tùy thuộc vào việc tham chiếu có trỏ đến một vô hướng, mảng hay hàm băm hay không. Sau đây là ví dụ để giải thích khái niệm -
#!/usr/bin/perl
$var = 10;
# Now $r has reference to $var scalar.
$r = \$var;
# Print value available at the location stored in $r.
print "Value of $var is : ", $$r, "\n";
@var = (1, 2, 3);
# Now $r has reference to @var array.
$r = \@var;
# Print values available at the location stored in $r.
print "Value of @var is : ", @$r, "\n";
%var = ('key1' => 10, 'key2' => 20);
# Now $r has reference to %var hash.
$r = \%var;
# Print values available at the location stored in $r.
print "Value of %var is : ", %$r, "\n";
Khi chương trình trên được thực thi, nó tạo ra kết quả sau:
Value of 10 is : 10
Value of 1 2 3 is : 123
Value of %var is : key220key110
Nếu bạn không chắc chắn về một kiểu biến, thì rất dễ dàng để biết kiểu của nó bằng cách sử dụng ref, trả về một trong các chuỗi sau nếu đối số của nó là tham chiếu. Nếu không, nó trả về false -
SCALAR
ARRAY
HASH
CODE
GLOB
REF
Hãy thử ví dụ sau:
#!/usr/bin/perl
$var = 10;
$r = \$var;
print "Reference type in r : ", ref($r), "\n";
@var = (1, 2, 3);
$r = \@var;
print "Reference type in r : ", ref($r), "\n";
%var = ('key1' => 10, 'key2' => 20);
$r = \%var;
print "Reference type in r : ", ref($r), "\n";
Khi chương trình trên được thực thi, nó tạo ra kết quả sau:
Reference type in r : SCALAR
Reference type in r : ARRAY
Reference type in r : HASH
Tham chiếu vòng tròn
Tham chiếu vòng tròn xảy ra khi hai tham chiếu chứa tham chiếu đến nhau. Bạn phải cẩn thận trong khi tạo tham chiếu nếu không tham chiếu vòng có thể dẫn đến rò rỉ bộ nhớ. Sau đây là một ví dụ -
#!/usr/bin/perl
my $foo = 100;
$foo = \$foo;
print "Value of foo is : ", $$foo, "\n";
Khi chương trình trên được thực thi, nó tạo ra kết quả sau:
Value of foo is : REF(0x9aae38)
Tham chiếu đến các hàm
Điều này có thể xảy ra nếu bạn cần tạo một trình xử lý tín hiệu để bạn có thể tạo ra một tham chiếu đến một hàm bằng cách đặt trước tên hàm đó bằng \ & và để hủy bỏ tham chiếu đó, bạn chỉ cần đặt trước biến tham chiếu bằng cách sử dụng ký hiệu và &. Sau đây là một ví dụ -
#!/usr/bin/perl
# Function definition
sub PrintHash {
my (%hash) = @_;
foreach $item (%hash) {
print "Item : $item\n";
}
}
%hash = ('name' => 'Tom', 'age' => 19);
# Create a reference to above function.
$cref = \&PrintHash;
# Function call using reference.
&$cref(%hash);
Khi chương trình trên được thực thi, nó tạo ra kết quả sau:
Item : name
Item : Tom
Item : age
Item : 19