Od linku podanego przez Andy, spróbuj Inline::C
approach. Będziesz chciał użyć wartości SV*
zamiast AV*
, ale powinno działać.
Kpiłem z przykładu, rozszerzając metodę pokazaną w tym łączu. Z moją ograniczoną znajomością C myślę, że udało mi się zapobiec Segfaultowi, gdy odniesienie nie wskazuje już niczego (testuj przez nie komentowanie wewnętrznych nawiasów klamrowych, pozwalając, by $ text wypadł z zakresu). Ponieważ używam newRV_inc
w sekcji C, liczba referencji dla $text
jest zwiększana. Dlatego jeśli $text
nie mieści się w zakresie, ale jego znalezione odniesienie ($recovered_ref
) nadal istnieje, wartość jest nadal dostępna, zgodnie z oczekiwaniami (test przez nie komentowanie zewnętrznych nawiasów klamrowych).
Ta metoda wydaje się działać dla każdego rodzaju odniesienia. Nie jestem pewien co do przedmiotów, daj mu szansę, jeśli chcesz. Aby uzyskać więcej informacji, pomoże Ci perldoc Inline::C
, ale aby kontynuować tę ścieżkę, musisz przeczytać perldoc perlguts
, a może nawet perldoc perlapi
.
#!/usr/bin/perl
use strict;
use warnings;
use Inline 'C';
my $stringified_ref_text;
my $stringified_ref_array;
my $recovered_ref_text;
my $recovered_ref_array;
#{
#{
my $text = "Hello World";
my @array = qw"Hello World!";
$stringified_ref_text = \$text . "";
$stringified_ref_array = \@array . "";
print $stringified_ref_text . "\n";
print $stringified_ref_array . "\n";
#}
$recovered_ref_text = recover_ref($stringified_ref_text);
$recovered_ref_array = recover_ref($stringified_ref_array);
#}
print $$recovered_ref_text . "\n";
print "$_\n" for @$recovered_ref_array;
sub recover_ref {
my $input = shift;
my $addr;
if ($input =~ /0x(\w+)/) {
$addr = hex($1);
} else {
warn "Could not find an address";
return undef;
}
my $ref = _recover_ref($addr) or undef;
return $ref;
}
__DATA__
__C__
SV* _recover_ref(int address) {
if (address)
return newRV_inc((SV*) address);
return 0;
}
pokrewne: http://stackoverflow.com/questions/1671281/how-can-i-convert-the-stringified-version-of-array-reference-to-actual-array-refe. Nie jest to podróbka, od kiedy chodziło o ARRAY. – Andy
Nie, odwołanie nie jest wskaźnikiem. Jak na początku stał się ciągiem? Tutaj jest błąd. – shawnhcorey
@ shawnhcorey, nie jest to wskaźnik, ale zawiera te same informacje, zobacz moją odpowiedź –