Problem mit Skalarer Referenz
Kalle
- perl
hey,
Ich bin gerade dabei ein MovableType Plugin zu schreiben und ich hab ein Problem mit einer Skalaren Referenz. Ich kann sie nicht ändern.
sub clean_content {
my ($cb, %args) = @_;
}
Wenn in dieser sub in das Log dies schreibe: $args{Content} bekomme ich so etwas: SCALAR(0x8fdb430)
Aber wenn ich versuche den Inhalt zu ändern passiert gar nichts:
$args{Content} = "test";
Kann mir jemand verraten was genau ich falsch mache?
lg, Kalle
hi Kalle,
sub clean_content {
my ($cb, %args) = @_;
}
my ($cb, %args) = @_; # ist das Problem
Weil: Aus @_ kannst Du nur Scalare ziehen oder Referenzen, nicht jedoch einen hash.
Machs besser so:
my %hash;
foo(3, \%hash); # funktionsaufruf
sub foo{
my($x, $y) = @_;
# $y ist eine Referenz auf einen hash
$$y{content} = $x; # oder sonstwas
return();
}
print $hash{content}; # sollte ne 3 sein
Hotte
Hallo Hotte,
Vielen Dank für deine Antwort. Ich verstehe nicht wie ich die variablen definieren muss. Bin neu bei Perl.
Meine sub wird von einen callback aufgerufen:
http://www.movabletype.org/documentation/developer/callbacks/build-page.html
Wie genau muss ich die args in diesem fall definieren um sie verändern zu können?
lg, Kalle
Weil: Aus @_ kannst Du nur Scalare ziehen oder Referenzen, nicht jedoch einen hash.
Das stimmt nicht. Ein Hash ist auch ein Array.
Struppi.
»» Weil: Aus @_ kannst Du nur Scalare ziehen oder Referenzen, nicht jedoch einen hash.
Das stimmt nicht. Ein Hash ist auch ein Array.
Da hast Du freilich recht, lieber Struppi. Ich bin nur bissl vorsichtig beim Übergeben von "arrays" in Subfunktionen. Referenzen finde ich von vornherein besser für sowas.
Einer meiner Lieblingsfehler:
my ($foo, $bar) = shift;
Hotte
hey,
Ich bin gerade dabei ein MovableType Plugin zu schreiben und ich hab ein Problem mit einer Skalaren Referenz. Ich kann sie nicht ändern.
sub clean_content {
my ($cb, %args) = @_;
}Wenn in dieser sub in das Log dies schreibe: $args{Content} bekomme ich so etwas: SCALAR(0x8fdb430)
Wenn ich das richtig verstehe, steht das so in der Doku $args{Content}. ich hab mal kurz gegoogled und ich vermute $args{Content} ist eine Referenz auf ein Template. (hier ein Ergebnis was mich das vermuten läßt.
Struppi.
Ich bin mir nicht sicher warum, aber dies hats getan:
${$args{Content}} =~ s/foo/bar/
Ich bin mir nicht sicher warum, aber dies hats getan:
${$args{Content}} =~ s/foo/bar/
Ich bin mir auch nicht sicher, aber ich muss damit ja auch nicht arbeiten.
Hast du dir mal mit Data::Dumper $args{Content} ausgeben lassen? Vielleicht ist das ja schon der geparste Inhalt.
Struppi.