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";
}
}