xNeTworKx: 2 Fragen (Subroutine, kürzere Schreibweise)

Hallo,
ich hab da mal wieder einmal Fragen zu Perl, und zwar hätte ich gerne diesmal gewusst, wie ich 1. folgendes kürzer ausdrucken kann:
zB:
my ($var1,$var2,$var3,$var4,$var5) = (0,0,0,0,0);
Kann ich das nicht irgendwie abkürzen ?

Frage 2 :
Wenn ich Werte einer Subroutine übergebe zB :
&test($wert1,$wert2);
warum kann ich dann von der Subrountine aus die Werte $wert1 und $wert2 nur dann verändern, wenn ich es folgendermaßen schreibe :

sub test    {
my ($wert1, $wert2) = @_;

$wert1 = 'neuerWert'; # nur $wert1 der Subroutine ändert sich,
                        # nicht ausserhalb
  $_[0] = 'neuerWert'; # jetzt hat $wert1 ausserhalb der Sr. den Wert
                       # neuer Wert.
}

ich finde es ziemlich unübersichtlich, wenn ich immer mit $_[0], $_[1], usw arbeiten muss. Kann ich nicht vielleicht irgendwie mit $wert1, $wert2 der Subrountine arbeiten, sodaß ich mit diesen Variablen den Wert verändern kann ?

danke im Vorhinein.

  1. Hoi,

    ich hab da mal wieder einmal Fragen zu Perl, und zwar hätte ich gerne diesmal
    gewusst, wie ich 1. folgendes kürzer ausdrucken kann:

    Schriftgroesse kleiner einstellen ;-))

    zB:
    my ($var1,$var2,$var3,$var4,$var5) = (0,0,0,0,0);
    Kann ich das nicht irgendwie abkürzen ?

    Nein.

    Frage 2 :
    Wenn ich Werte einer Subroutine übergebe zB :
    &test($wert1,$wert2);

    Bitte(!) nicht &test() schreiben -- test() reicht voellig aus. Das & ist ein
    Ueberbleibsel aus Perl4 und hat unter Umstaenden einige negative Auswirkungen.
    Fuer mehr Infos, schau dir perldoc perlsub an.

    warum kann ich dann von der Subrountine aus die Werte $wert1 und $wert2 nur
    dann verändern, wenn ich es folgendermaßen schreibe:

    sub test    {
    my ($wert1, $wert2) = @_;

    $wert1 = 'neuerWert'; # nur $wert1 der Subroutine ändert sich,
                            # nicht ausserhalb
      $_[0] = 'neuerWert'; # jetzt hat $wert1 ausserhalb der Sr. den Wert
                           # neuer Wert.
    }

    Weil @_ eine Art magische Referenz auf die Orginal-Variable enthaelt. Und mit

    my ($wert1,$wert2) = @_;

    legst du eine Kopie an.

    ich finde es ziemlich unübersichtlich, wenn ich immer mit $_[0], $_[1], usw
    arbeiten muss. Kann ich nicht vielleicht irgendwie mit $wert1, $wert2 der
    Subrountine arbeiten, sodaß ich mit diesen Variablen den Wert verändern
    kann?

    Benutze echte Referenzen.

    my $x = 'a';

    print "a is: $a\n";
    doit($a);
    print "a is: $a\n";

    sub doit($) {
      my $ref = shift;
      $$ref   = 'b';
    }

    Gruesse,
     CK

    1. Hallo,

      Benutze echte Referenzen.

      my $x = 'a';

      print "a is: $a\n";
      doit($a);
      print "a is: $a\n";

      sub doit($) {
        my $ref = shift;
        $$ref   = 'b';
      }

      Aha =) jetzt verstehe ich schön langsam wobei ich Referenzen gebrauchen kann :)
      Übrigens wollte ich mich nochmal für das hier: $text =~ s/(\s\s+)/(' ' x (length($1)-1)) . ' '/eg;
      bedanken. Du hast es mir vorigen Monat beim meinem Forum Formatierungsproblem gepostet, und es funktioniert tadellos, nur verstehe ich das mit dem 'e' noch nicht so ganz, da darauf in meinem Buch nicht näher eingegangen wird, aber ich werd mich bei Gelegenheit mal damit beschäftigen.

      1. Hoi,

        Übrigens wollte ich mich nochmal für das hier: $text =~ s/(\s\s+)/(' ' x
        (length($1)-1)) . ' '/eg;
        bedanken. Du hast es mir vorigen Monat beim meinem Forum Formatierungsproblem
        gepostet, und es funktioniert tadellos, nur verstehe ich das mit dem 'e' noch
        nicht so ganz, da darauf in meinem Buch nicht näher eingegangen wird, aber
        ich werd mich bei Gelegenheit mal damit beschäftigen.

        'execute' oder 'evaluate' (da streiten sich die Geister :-). Der
        Ersetzungs-Ausdruck (in diesem Fall ((' ' x length($1)-1).' ') wird
        ausgefuehrt.

        Gruesse,
         CK

        1. Hi,

          'execute' oder 'evaluate' (da streiten sich die Geister :-). Der
          Ersetzungs-Ausdruck (in diesem Fall ((' ' x length($1)-1).' ') wird
          ausgefuehrt.

          achso ist das :) eigentlich ziemlich klar und eigentlich logisch.

    2. Hallo.

      Frage 2 :
      Wenn ich Werte einer Subroutine übergebe zB :
      &test($wert1,$wert2);

      Bitte(!) nicht &test() schreiben -- test() reicht voellig aus. Das & ist ein
      Ueberbleibsel aus Perl4 und hat unter Umstaenden einige negative Auswirkungen.
      Fuer mehr Infos, schau dir perldoc perlsub an.

      Kleine Ergaenzung.
      Ueberbleibsel ist nicht ganz richtig. Das '&' hat schon seinen Sinn, wenn man in einer Subroutine eine andere ohne Argument aufruft wird durch das '&' davor  der aktuelle Array '@_' uebergeben. Oder man ruft eine Subroutine mit 'goto' auf. Dann braucht man auch das '&'.
      Aber Du hast recht - wenn man sowas nicht macht, sollte man es sicherheitshalber und korrekterweise weglassen.

      Gruss, Thomas.

      1. Moin!

        Frage 2 :
        Wenn ich Werte einer Subroutine übergebe zB :
        &test($wert1,$wert2);

        Bitte(!) nicht &test() schreiben -- test() reicht voellig aus.
        Das & ist ein Ueberbleibsel aus Perl4 und hat unter Umstaenden
        einige negative Auswirkungen. Fuer mehr Infos, schau dir perldoc
        perlsub an.

        Kleine Ergaenzung.
        Ueberbleibsel ist nicht ganz richtig.

        Nun -- es *ist* ein Ueberbleibsel.

        Das '&' hat schon seinen Sinn, wenn man in einer Subroutine eine
        andere ohne Argument aufruft wird durch das '&' davor  der
        aktuelle Array '@_' uebergeben.

        Richtig. Das waren die unangenehmen Nebenwirkungen, von denen ich
        sprach.

        Aber Du hast recht - wenn man sowas nicht macht, sollte man es
        sicherheitshalber und korrekterweise weglassen.

        Ich wuerde ehrlich gesagt sagen, im Sinne eines sauberen
        Programmierstils sollte man statt

        sub blub {
          &blah;
        }

        lieber

        sub blub {
          blah(@_);
        }

        schreiben. Das mag zwar etwas weniger performant sein (es muss erst
        eine Kopie der Liste angelegt werden, IMHO), aber wenigstens weiss
        man auf den ersten Blick, was gemeint ist.

        Gruesse,
         CK

  2. Hi!

    ich hab da mal wieder einmal Fragen zu Perl, und zwar hätte ich gerne diesmal gewusst, wie ich 1. folgendes kürzer ausdrucken kann:
    zB:
    my ($var1,$var2,$var3,$var4,$var5) = (0,0,0,0,0);

    Ein *bisschen* kuerzer, aber nicht sehr:
    my ($var1,$var2,$var3,$var4,$var5) = (0)x5;

    Wenn Du 80 Variablen hast, denen Du allen den Wert 12345 geben willst, lohnt es sich vielleicht. ;-)

    Wie der x-Operator funktioniert? perldoc perlop, Multiplicative operators.

    So long

    --
    Die Aggressivitaet kommt vom Heavy Metal!!! CounterStrike ist doch nur zum Runterkommen!!!!!