AndreasW: Seltsames Verhalten bei Parameterübergabe

Hallo,

ich habe ein kleines Problem mit regulären Ausdrücken und einer Perl-Funktion.
Hier ist der extrahierte, auf das notwendigste reduzierte Code:

sub myfunction
{
my $line = $_[1];
my $cnt = 0;
while ($cnt < ($_[0]))
{
print $cnt;
print " ";
print $_[$cnt + 2];
print "\n";
}
return $line;
}

while (<>)
{
$myline = "sometext";

if (m/SOMETHING\("(.\*)",(.\*)\)/)  
{  

$dummy = $2;
  $line = myfunction(2,$myline,$1,$dummy);
}
}

aufgerufen  mit Eingabezeile:
SOMETHING("blabla",laber)

ergibt als Ausgabe
0 blabla
1 laber

Ersetze ich im Funktionsaufruf aber $dummy durch $2, erhalte ich als Ausgabe
d.h.
if (m/SOMETHING("(.*)",(.*))/)
{
  $line = myfunction(2,$myline,$1,$dummy);
}
  
bekomme ich als Ausgabe

0 blabla
1

d.h. der letzte Parameter kommt nicht mehr bei der Funktion an.

Ist da irgendwo ein Denkfehler bei mir?

Andreas

  1. Hi,

    Ersetze ich im Funktionsaufruf aber $dummy durch $2, erhalte ich als Ausgabe
    d.h.

    »»  if (m/SOMETHING("(.*)",(.*))/)
    »»  {

    $line = myfunction(2,$myline,$1,$dummy);

    *hüstl*
    Ähm, achte beim copy&paste doch bitte darauf, das richtige zu kopieren. Oder war das vielleicht schon der Fehler? ;-)

    Cheatah

  2. Hallo!

    1. Siehe Cheatah's Antwort.

    2. Auch *huestl*.
    »»  while ($cnt < ($_[0]))
    »»  {

    print $cnt;
    print " ";
    print $_[$cnt + 2];
    print "\n";

    »»  }
    Klassischer Fall von Endlosschleife. Hast Du beim Copy&Pasten vielleicht ein $cnt++ zuviel weggelassen?

    3. Verwende keine Tabs, sondern Leerzeichen. Wie Du siehst, werden Tabs bei jeder Gelegenheit anders interpretiert oder auch ignoriert. Sieht einfach immer scheisse aus, wenn der Source so durcheinandergewuerfelt ist. ;-)

    So long

  3. [verhunztes Originalposting eliminiert]
    Hallo,

    hier nochmal der korrekte fehlerhafte Code (der Code, der nach wie vor den beschriebenen Fehler produziert, diesmal aber
    aus dem richtigen Testscript - ich hatte vorher aus einer aelteren Version kopiert und natuerlich statt copy-paste-adapt nur
    copy-paste-forget gemacht) Sorry - irgendwie war ich nach laengerer Fehlersuche nicht mehr in der Lage, das Posting korrekt
    auf die Reihe zu bringen. Tut mir leid, trotzdem danke ich Euch schon mal fuer die Muehe, die Ihr Euch gemacht habt.

    So, nu muss ich noch die Tabs eliminieren (so dick war das script ja nicht, dass man es nicht haette rauskriegen koennen -
    ausserdem tendiere ich sowieso dazu, Debug-Code wie die Prints in der Funktion gar nicht einzuruecken, um das Zeug schneller
    wieder eliminieren zu koennen), dann kann ich das nochmal absenden.
    Mit der Bitte, dass Ihr nochmal einen Blick drauf werft.
    TIA,
    Andreas

    sub myfunction
    {
        my $line = $_[1];
        my $cnt = 0;
        while ($cnt < ($_[0]))
        {
            print $cnt;
            print " ";
            print $_[$cnt + 2];
            print "\n";
            $cnt += 1;
        }
        return $line;
    }

    while (<>)
    {
        $myline = "sometext";

    if (m/SOMETHING("(.*)",(.*))/)
        {
            $dummy = $2;
            $line = myfunction(2,$myline,$1,$dummy);
        }
    }

    aufgerufen  mit Eingabezeile:
    SOMETHING("blabla",laber)

    ergibt als Ausgabe
    0 blabla
    1 laber

    Ersetze ich im Funktionsaufruf aber $dummy durch $2, erhalte ich als Ausgabe
    d.h.
    if (m/SOMETHING("(.*)",(.*))/)
    {
        $line = myfunction(2,$myline,$1,$2);
    }
      
    bekomme ich als Ausgabe

    0 blabla
    1

    d.h. der letzte Parameter kommt nicht mehr bei der Funktion an.

    Ist da immer noch irgendwo ein Denkfehler bei mir?
    TIA
    Andreas

    1. Hallo Andreas,

      echt merkwürdig. Bei mir funktioniert's in beiden Fällen gleich.
      Hast du wirklich sonst nichts verändert?

      CYa
      GONZO

      1. Hallo Andreas,

        echt merkwürdig. Bei mir funktioniert's in beiden Fällen gleich.
        Hast du wirklich sonst nichts verändert?

        CYa
        GONZO

        Nein, sonst habe ich nichts veraendert.
        Ich hab den Rechner gebootet, Perl deinstalliert, neu installiert... - ich versteh es nicht!
        Der Fehler tritt immer auf.
        Und ich finde es laestig, wenn ich die $2 usw. immer erst auf andere Variablen umsetzen muss.
        Im echten Script passiert natuerlich wesentlich mehr aussenrum, aber am beschriebenen Verhalten aendert das nix.
        Ich habe dann schrittweise alles andere rausgeschmissen, um rauszufinden, ob irgendwas anderes den Fehler verursachen koennte, und bin dann irgendwann bei diesem minimierten Script gelandet.

        Andreas

        1. Hallo Andreas,

          OK, dann kommen wir jetzt zu den wichtigen Informationen, die ich noch vergessen hatte anzugeben:

          Ich benutze Perl in Version 5.6.0
          built for MSWin32-x86-multi-thread
          ActivePerl build 613

          Und jetzt kommst du. (-:

          CYa
          GONZO

          1. Hallo Andreas,

            OK, dann kommen wir jetzt zu den wichtigen Informationen, die ich noch vergessen hatte anzugeben:

            Ich benutze Perl in Version 5.6.0
            built for MSWin32-x86-multi-thread
            ActivePerl build 613

            Und jetzt kommst du. (-:

            CYa
            GONZO

            Uuuuuuuups, ich glaube, ich muß da mal updaten - ich habe nie auf die Version geachtet, da das Ding bisher alles tat, was ich von ihm wollte (zumindest wenn ich es syntaktisch korrekt geliefert habe).
            Meine Version ist: (perl -v)
            Win32 port Copyright (c) 1995 Microsoft Corporation. All rights reserved.
                    Developed by hip communications inc., http://info.hip.com/info/
            Perl for Win32 Build 107
            Built Apr 29 1996@22:56:57

            dürfte also etwas veraltet sein...
            Mal schauen, was passiert, wenn ich mir ne neue Version geholt habe...
            cu,
            Andreas

            1. Hallo Andreas,

              OK, dann kommen wir jetzt zu den wichtigen Informationen, die ich noch vergessen hatte anzugeben:

              Ich benutze Perl in Version 5.6.0
              built for MSWin32-x86-multi-thread
              ActivePerl build 613

              Und jetzt kommst du. (-:

              CYa
              GONZO
              Uuuuuuuups, ich glaube, ich muß da mal updaten - ich habe nie auf die Version geachtet, da das Ding bisher alles tat, was ich von ihm wollte (zumindest wenn ich es syntaktisch korrekt geliefert habe).
              Meine Version ist: (perl -v)
              Win32 port Copyright (c) 1995 Microsoft Corporation. All rights reserved.
                      Developed by hip communications inc., http://info.hip.com/info/
              Perl for Win32 Build 107
              Built Apr 29 1996@22:56:57

              dürfte also etwas veraltet sein...
              Mal schauen, was passiert, wenn ich mir ne neue Version geholt habe...
              cu,
              Andreas

              Hallo,
              also nach Download und Install von
              perl, v5.6.0 built for MSWin32-x86-multi-thread
              ist das Problem noch schlimmer: jetzt muß ich alle Variablen, die sich auf Teilausdrücke eines regulären Ausdrucks beziehen (d.h. $1, $2, $3, ...) auf Variablen umspeichern, damit sie in einer Funktion, der sie als Parameter übergeben werden, auch ankommen.
              D.h.
              $dummy1 = $1; $dummy2 = $2; $dummy3 = $3;
              myfunction($dummy1,$dummy2,$dummy3);
              statt
              myfunction($1,$2,$3);

              Andreas