2011-04-22 13 views
8

Powiel możliwe:
How can I convert the stringified version of array reference to actual array reference in Perl?Perl: Konwertuj ciąg do odniesienia?

mam "SKALAR (0x8ec3a94)" jako dosłownego łańcucha. Czy mogę zmusić Perla do zmienić to w odnośnik, a następnie wykonać?

IE, powiedz Perlowi: "spójrz na lokalizację pamięci 0x8ec3a94 i leczyć cokolwiek tam jest jako skalar"?

związane z: Perl: Unwrapping list inside-out doesn't work?

I tak, zdaję sobie sprawę, że jest to straszna rzecz.

+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

+1

Nie, odwołanie nie jest wskaźnikiem. Jak na początku stał się ciągiem? Tutaj jest błąd. – shawnhcorey

+0

@ shawnhcorey, nie jest to wskaźnik, ale zawiera te same informacje, zobacz moją odpowiedź –

Odpowiedz

3

Najbliższe, jakie można uzyskać, to Tie::RefHash. Wersja biedaka spożywcze odniesień w hash

$registry{"$ref"} = $ref; 

a następnie ciągnie go później

print ${ $registry{"SCALAR(0x8ec3a94)"} }, "\n"; 

to ma wiele wad podejścia. Dlaczego chcesz to zrobić w ten sposób?

+0

Próbuję parsować coś "na wylot", zaczynając od najbardziej wewnętrznego odniesienia i pracując na swój sposób. – barrycarter

3

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; 
} 
+0

Domyślnie StackOverflow pokazuje odpowiedzi posortowane według wyniku, a następnie ustawia losowo więzy (pozornie). Oznacza to, że link, do którego się odnosisz, może pojawić się pod twoją odpowiedzią lub (w pytaniach o większej aktywności) pojawia się kilka miejsc nad tobą z innymi łączami pośrednimi. Więc nie mów o tym jako o "powyższym linku", jeśli chcesz, aby ludzie wiedzieli, który link masz na myśli. –

+0

@Dave, to ten sam link, który mam, tylko moje wskazuje na konkretną odpowiedź w środku. Czy powinienem zamieścić dwa linki do tego samego pytania? To powinno zrobić. –

+1

Czekałem z prostego powodu, aby nauczyć się tworzyć i pakować moduł XS dla CPAN (dopiero kilka dni temu wypuściłem tylko mój pierwszy czysty moduł perłowy). Czy jest to coś, co ludzie chcieliby na CPAN? Dałoby mi to powód, by spróbować. –