Đây có lẽ là tốt nhất thực hiện với một băm trói. Các biến gắn kết cho phép bạn xác định việc thực hiện các hoạt động ở mức độ thấp của biến. Trong trường hợp này, chúng tôi muốn có một phương pháp lấy đặc biệt mà chết khi truy cập vào các phím không tồn tại:
use warnings;
use strict;
{package Safe::Hash;
require Tie::Hash;
our @ISA = 'Tie::StdHash';
use Carp;
sub FETCH {
exists $_[0]{$_[1]} or croak "no key $_[1]";
$_[0]{$_[1]}
}
}
tie my %safe => 'Safe::Hash';
$safe{a} = 5; # ok
print $safe{a}, "\n"; # ok
$safe{b} = 10; # ok
print $safe{bb}, "\n"; # dies
trong việc thực hiện các Safe::Hash
trên, đầu tiên tôi tải Tie::Hash
cung cấp Tie::StdHash
. Đặt @ISA
thành Tie::StdHash
cung cấp gói mới của chúng tôi với các phương thức tie hoạt động theo cách tương tự như băm thông thường. Mỗi phương pháp liên kết được nêu trên http://perldoc.perl.org/perltie.html
Trong trường hợp này, phương pháp duy nhất để ghi đè là FETCH
được chuyển qua tham chiếu đến đối tượng được gắn ẩn (trường hợp này là hashref) và khóa để sử dụng. Nó sẽ kiểm tra xem vị trí đó có tồn tại hay không và trả về lỗi hoặc ném một lỗi
Nguồn
2010-08-01 15:09:28
Bạn không có ý định kiểm tra xem khóa có được 'định nghĩa' hay không, nhưng liệu nó có tồn tại hay không. Không có các khóa băm không xác định * mỗi lần *. – pilcrow
@pilcrow cảm ơn sự điều chỉnh. –