Rückgabewert bei Perlfunktionen
-
Hi Leute
Ich möchte eine Liste als ergebnis einer Funktion zurückgeben.
Das Problem: Es wird nicht der Inhalt der Liste zurückgegeben, sondern
nur deren Länge. Es gibt zwar die möglichkeit mit call by referenc zu arbeiten,
doch vielen tuts zu diesen Thema nach, müsste das auch gehen:@inhalt= &getdatei($dateiname); sub getdatei { local @datei; local $eingabe; if( -e $_[0] && -f $_[0]){ open DAT, "<$_[0]"; @datei= <DAT>; close DAT; print "Datei ausgeben?\n> "; $eingabe= <STDIN>; if($eingabe eq "j\n" || $eingabe eq "J\n"){ print @datei; } } else{ die "Die Datei \"$_[0]\" kann nicht geoffnet werden!\n"; } return @datei; }
wieso geht das nicht?
Bitte um eure Hilfe
-
Sowas geht bei mir toll:
#!/usr/bin/perl -w @inhalt = &getdatei("test.html"); print @inhalt; sub getdatei { local @datei; if ( -e $_[0] && -f $_[0]) { open DAT, "<$_[0]"; @datei= <DAT>; close DAT; } else { die "Die Datei \"$_[0]\" kann nicht geoeffnet werden.\n"; } return @datei; }
Allerdings kannst Du dafür auch einfach slurp oder wie das heißt verwenden.
-
@nman Vielen dank für deine Antwort!
Doch dies klapt bei mir beim besten willen nicht
dies:
#!/usr/bin/perl -w @inhalt = &getdatei("test.html"); print @inhalt;
liefert bei mir nur die Zeilenanzahl, nicht den Inhalt.
Doch so wie du es beschrieben hast beschreiben das auch andere.Irgendetwas stimmt wohl mit meinem interpreter nicht
-
Was sagt denn ein perl -v?
-
nman schrieb:
Was sagt denn ein perl -v?
This is perl, v5.8.0 built for i386-linux-thread-multi
-
Halt moment mal, deine Version der Funktion geht doch
sry
Doch bei meinem Übungsprog geht das nicht
Hier noch mal der vollständige code des testscriptes:#!/usr/bin/perl $dateiname= ""; $suchmuster= ""; print "Durchsuchung von Dateien nach Suchmustern\n\n"; print "Bitte geben Sie eine Datei an!\n> "; $dateiname= <STDIN>; chop $dateiname; @inhalt= &getdatei($dateiname); print "Inhalt: \n". @inhalt; print "Bitte geben sie ein vollstaendiges suchmuster an!\n> "; $suchmuster= <STDIN>; chop $suchmuster; # print "Suchmuster: $suchmuster\n"; &findmuster(\@inhalt, $suchmuster); print "ENDE\n"; sub getdatei { local @datei; local $eingabe; if( -e $_[0] && -f $_[0]){ open DAT, "<$_[0]"; @datei= <DAT>; close DAT; print "Datei ausgeben?\n> "; $eingabe= <STDIN>; if($eingabe eq "j\n" || $eingabe eq "J\n"){ print @datei; } } else{ die "Die Datei \"$_[0]\" kann nicht geoffnet werden!\n"; } return @datei; } sub findmuster { local $zeile; local $anzahl= 0; local $muster= $_[1]; local @dateiinhalt= $$_[0]; print "Dateiinhalt: \n".@dateiinhalt; print "Suchmuster: $muster\n"; foreach $zeile (@dateinhalt){ $anzahl++; if($zeile =~ $_[1]){ print "Suchmuster: \"$muster\" gefunden in Zeile $anzahl !\n"; } } print "Die Datei \"$dateiname\" hat $anzahl Zeilen!\n"; return; }
Da geht das nicht! Das wundert mich schon etwas denn schliesslich ist das fast das gleiche, oder?
-
In der Zeile
print "Inhalt: \n". @inhalt;
benutzt du @inhalt im skalaren Kontext!
Änder das mal in
print "Inhalt: \n". "@inhalt";
MfG
-
Vielen dank
Das war es
Jedoch da hab ich noch ein weiteres Poblem int der funktion findmuster:
Die Liste @inhalt kommt da nicht an!
Die Zeile:print "Dateiinhalt: \n"."@dateiinhalt";
gibt nix aus.
Für Hilfe wäre ich sehr dankbar
-
ja, weil du an dieser Stelle:
local @dateiinhalt= $$_[0];
die übergebene Referenz nicht als Array dereferenzierst.
Du derefernzierst die Arrayreferenz als Skalar.Du musst das so schreiben:
local @dateiinhalt= @{$_[0]};
Die geschweiften Klammern sind wegen dem Vorrang der Dereferenzierung vor dem Arrayzugriff notwendig.
Übrigens ist es allgemein empfehlenswerter my anstatt von local zu verwenden.
MfG
// übrigens hast du einen Schreibfehler in der Zeile
foreach $zeile (@dateinhalt){
Das muss @dateiinhalt heißen!
Damit solche Fehler vermeidet werden können, gibt's das "use strict;" Pragma.
Solltest du dir vielleicht bei Gelegenheit mal anschauen, damit kannst du dir ne Menge Ärger ersparen!
-