我知道这caller
会给我调用函数的文件名和行号,但是如何获取字符或字节偏移量?如果我必须为它下降到 XS 也没关系(无论如何,该功能可能最终会成为 XS)。
我要做的是唯一标识对函数的所有调用,因此,如果有比源中的位置更好的方法,我对其他路线持开放态度。
基本意图是创建一个each
可以安全地迭代相同哈希的函数。这是一个纯 Perl 版本,类似于我的想法:
#!/usr/bin/perl
use 5.012;
use warnings;
use Scalar::Util qw/refaddr/;
sub safe_each(\%) {
my $h = shift;
my $key = join "/", (caller)[1,2], refaddr $h;
state %iter;
unless (exists $iter{$key}) {
$iter{$key} = [ keys %$h ];
}
unless (@{$iter{$key}}) {
delete $iter{$key};
return;
}
my $cur = shift @{$iter{$key}};
return wantarray ? ($cur, $h->{$cur}) : $cur;
}
my %h = (a => 1, b => 2);
while (my ($k, $v) = safe_each %h) {
say "$k => $v";
while (my ($k, $v) = safe_each %h) {
say "\t$k => $v";
}
}