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



  • @rocksteady

    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!



  • @rocksteady

    Vielen dank für Deine (sehr kompetente) Hilfe 🙂 Jetzt funzt ales wie es soll.
    THX 🙂

    Gruss 🙂


Anmelden zum Antworten