Kalle: Problem mit Skalarer Referenz

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

  1. 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

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    1. 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

    2. Weil: Aus @_ kannst Du nur Scalare ziehen oder Referenzen, nicht jedoch einen hash.

      Das stimmt nicht. Ein Hash ist auch ein Array.

      Struppi.

      1. »» 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

        --
        Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  2. 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.

    1. Ich bin mir nicht sicher warum, aber dies hats getan:
      ${$args{Content}} =~ s/foo/bar/

      1. 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.