Seltsames Verhalten bei Parameterübergabe
AndreasW
- perl
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
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
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
[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
Hallo Andreas,
echt merkwürdig. Bei mir funktioniert's in beiden Fällen gleich.
Hast du wirklich sonst nichts verändert?
CYa
GONZO
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
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
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 613Und 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 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 613Und 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:57dü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