Tie :: Hash有这些:
sub FIRSTKEY { my $a = scalar keys %{$_[0]}; each %{$_[0]} }
sub NEXTKEY { each %{$_[0]} }
Run Code Online (Sandbox Code Playgroud)
NEXTKEY有两个参数,其中一个是最后一个键,但arg从未被引用过?
除了perltie之外,各种各样的Tie文档并没有说明这一点:
my $a = keys %{$self->{LIST}}; # reset each() iterator
Run Code Online (Sandbox Code Playgroud)
查看每个文档并不会增加这一点.
这是怎么回事?
Cha*_*ens 11
NEXTKEY如果你关心最后访问哪个键,你只需要担心第二个参数.默认情况下,哈希不关心顺序,因此不使用它.
至于第二部分,keys标量上下文中的函数返回散列中的项数.对键的任何调用都会重置使用的迭代器keys,each因为它会耗尽迭代器.
呼叫keys实际上是一个呼叫FIRSTKEY和呼叫,NEXTKEY直到没有剩余的项目还没有返回.
调用each是对FIRSTKEY(如果FIRSTKEY尚未调用)或调用NEXTKEY(如果FIRSTKEY已被调用)的调用.
#!/usr/bin/perl
use strict;
use warnings;
my $i = 0;
tie my %h, "HASH::Sorted", map { $_ => $i++ } "a" .. "g";
for my $key (keys %h) {
print "$key => $h{$key}\n";
}
print "\n";
my $first = each %h;
print "first $first => $h{$first}\n";
my ($second_key, $second_value) = each %h;
print "second $second_key => $second_value\n";
print "\nall of them again:\n";
for my $key (keys %h) {
print "$key => $h{$key}\n";
}
package HASH::Sorted;
sub TIEHASH {
my $class = shift;
return bless { _hash => { @_ } }, $class;
}
sub FETCH {
my ($self, $key) = @_;
return $self->{_hash}{$key};
}
sub STORE {
my ($self, $key, $value) = @_;
return $self->{_hash}{$key} = $value;
}
sub DELETE {
my ($self, $key) = @_;
return delete $self->{_hash}{$key};
}
sub CLEAR {
my $self = shift;
%{$self->{_hash}} = ();
}
sub EXISTS {
my ($self, $key) = @_;
return exists $self->{_hash}{$key};
}
sub FIRSTKEY {
my $self = shift;
#build iterator
$self->{_list} = [ sort keys %{$self->{_hash}} ];
return $self->NEXTKEY;
}
sub NEXTKEY {
my $self = shift;
return shift @{$self->{_list}};
}
sub SCALAR {
my $self = shift;
return scalar %{$self->{_hash}};
}
Run Code Online (Sandbox Code Playgroud)