Schrift
[thread]7162[/thread]

ARRAY(0x85d400c) wieder in Referenz zurückwandeln



<< >> 10 Einträge, 1 Seite
Ishka
 2005-07-27 00:02
#56699 #56699
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hallo,

Wenn man eine Referenz in einen String einbaut, kommt ja das schöne ARRAY(0x85d400c) oder ähnliches dabei raus. Und nachdem mir die Frage schon länger durch den Kopf geistert und das mal wieder praktisch wäre, frage ich einfach: Gibt es einen Weg das wieder zurückzuverwandeln? Und wenn ja, wie?

Mir ist durchaus bewusst, daß die referenzierte Variable nicht mehr zwangsweise existieren muß, aber dann sollte man halt das rausbekommen können.

danke,
Ishka
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
esskar
 2005-07-27 00:15
#56700 #56700
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ich glaube nicht;
Perl ist ja nicht C und hat keine Pointer arithmetic.

Kanntest du schon
Code: (dl )
1
2
3
my $arrayref = [];
print "$arrayref\n";
print 0+$arrayref, "\n";

?\n\n

<!--EDIT|esskar|1122408977-->
betterworld
 2005-07-27 00:20
#56701 #56701
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=esskar,26.07.2005, 22:15]
Code: (dl )
print 0+$arrayref, "\n";
[/quote]
Das habe ich neulich mal mit einer Referenz auf ein Tk-Widget versucht, und musste feststellen, dass Tk den Plus-Operator ueberladen hat... :(
Ishka
 2005-07-27 00:25
#56702 #56702
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=esskar,26.07.2005, 22:15]ich glaube nicht;
Perl ist ja nicht C und hat keine Pointer arithmetic.

Kanntest du schon
Code: (dl )
1
2
3
my $arrayref = [];
print "$arrayref\n";
print 0+$arrayref, "\n";

?[/quote]
Ja, kannte ich.

Nichts desto trotz könnte perl ja seine Referenzen irgendwie wiederfinden können.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
ptk
 2005-07-27 12:10
#56703 #56703
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
http://search.cpan.org/~rlzwart/Acme-Ref/\n\n

<!--EDIT|ptk|1122451894-->
Ishka
 2005-07-27 12:18
#56704 #56704
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
super, danke. Genau sowas hab ich gesucht :)
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
esskar
 2005-07-27 12:24
#56705 #56705
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Ishka,27.07.2005, 10:18]super, danke. Genau sowas hab ich gesucht :)[/quote]

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SV *
_deref(int ref)
CODE:
if (ref) {
SV *r = (SV *) ref;
if (SvTYPE(r)>0) {
RETVAL = newRV_inc(r);
}
else {
RETVAL = &PL_sv_undef;
}
}
else {
RETVAL = &PL_sv_undef;
}
OUTPUT:
RETVAL


Also pointer arithmetic...

aber wie du siehst, ist es C Code, und kein Perl!\n\n

<!--EDIT|esskar|1122452719-->
ptk
 2005-07-27 15:02
#56706 #56706
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Perl ist ja auch in C geschrieben! Es geht hier nur um den feinen Unterschied, ob sich die deref-Funktion in einem Standard-Perlmodul oder gar im Perl-Binary, oder in einem zusaetzlichen Modul befindet.
Gast Gast
 2005-07-27 15:12
#56707 #56707
[quote=ptk,27.07.2005, 13:02]Perl ist ja auch in C geschrieben![/quote]
Noch.
esskar
 2005-07-27 15:19
#56708 #56708
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
use Acme::Ref qw/deref/;

$h = "HASH(0x225288)";
print deref("$h")->{yomomma};
^Z
Not a HASH reference at - line 4.
Attempt to free unreferenced scalar: SV 0x225288, Perl interpreter: 0x224394.
<< >> 10 Einträge, 1 Seite



View all threads created 2005-07-27 00:02.