Perl Mongers :: deutschsprachig - German.pm

A wiki for German-speaking Perl & Raku programming language(s) user groups.

Änderungen, Hilfe

Treffen, Veranstaltungen

Leute, Gruppen, Ziele

PerlLernen

Best of Perl Books
Die Besten Bücher

ErfolgsStories

Links, FAQ, Forum

Mailing List

Impressum


Liebe(r) Perl Monger(in),

diese Site ist bereits seit langem ein Ziel von Spamrobotern. Neu ist, dass ich das Aufräumen leid bin. Darum schreibe mir eine Mail mit Deinem Usernamen und einem Crypt Passwort, damit Du einen passwortgeschtzten Zugang zu dieser Site von mir erhältst. Eines baldigen Tages wirst Du den brauchen, um hier weiterhin Seiten verändern zu können.

Vielen Dank, Sören


Amazon-Angebote... (Einkauf über diesen Link sponsort den Unterhalt von perlmongers.de)

Hallo Freunde,

ich breche mir schon seit einigen Tagen an dem Skript die Finger ab (bin noch Perl Einsteiger)-aber irgendwie würde ich das schon gerne mit meinem Perl hinbekommen.

  • 1. Sollte mir das Skript die Sessionen in eine Datei schreiben
  • 2. ggf. an die Datei anhängen
  • 3. Das was gerade in die Datei geschrieben wurde auf der Kommandozeile wieder ausgeben.
  • 4. Irgendwann noch viele andere Sachen machen -- Mario Schröder
#!/usr/contrib/bin/perl -w
#use strict;
my $datei = "/home/mario/scripts/test.txt";

soweit, so gut. Das use strict; würde ich so lange drin lassen, bis das Programm läuft. Dann würde ich es auch drin lassen ;-)

open (BLUBB, '> $datei');
Neu: 
open (BLABB, '>> $datei');

Das geht nicht,

  • denn innerhalb von '...' werden Variablen nicht interpoliert. "..." oder qq(...) verwenden.
  • open mit ">" schreibt zerstörend. Was auch immer in der Datei war, ist nun weg.
    • Mehr zu open findest Du hier in perlintro und natürlich auch in perldoc perlopentut und perldoc -f open
  • Das "Neu"e ist keinen Deut besser, siehe erneut die drei Punkte über diesem.
@zeilen = <BLUBB>;

@zeilen ist nun leer, denn zum einen wurde die Datei eine Code-Zeile zuvor geleert, und dann auch nicht zum Lesen "<", sondern zun Schreiben ">" geöffnet. Denke Dir "<" und ">" wie die gewohnten Umleitungen in der Unix-Shell.

close BLUBB;

&session_id();

Hier hätte session_id() auch ohne & ausgereicht.

sub session_id
{
    my $datei = "/home/mario/scripts/test.txt";

    open (BLUBB, '>> $datei');
    @zeilen = <BLUBB>;

Das funktioniert auch hier nicht, siehe oben...

close BLUBB;
 
print "Geben Sie nacheinander die Session ID (ohne , Datum) an: \n";
while (<>) {
    foreach $_ (@_) {
Fehler:
    foreach (chomp @_)

Leider hatte ich hier das Problem, dass nach der Wertübergabe an die Variable das /n noch mit übergeben wurde. Der chomp ist an der richtigen Stelle manchmal Gold wert. --Mario

Das ES ($_) muß man nicht beim Namen nennen, also einfach foreach ( @_ )

system '/opt/omni/bin/omnidb -session 2004/12/01-$_ -report >> /home/mario/scripts/test.txt' ; #Oder die $Datei

Hier gilt wie oben schon:

  • innerhalb von '...' werden Variablen nicht interpoliert. "..." oder qq(...) verwenden.
            print "system /opt/omni/bin/omnidb -session 2004/12/01-$_ -report";
        }
    return
    }
}; # End sub session_id

Ich hoffe, das hilft schonmal weiter. --Sören

Zum ganzen überfluss würde ich nun noch ganz gerne mehr als eine Session_id übergeben. Damit es dann eine Arbeitserleichterung war :-)

Wie muss ich dann die folgende Zeile ändern, um das ganze im Listenkontext verwenden zu können?

print "Geben Sie nacheinander die Session ID (ohne , Datum) an: \n";
   while (<>) {
         foreach (chomp @_) {
 }

Nana, Das while (<>) { ... liefert Dir je Schleifendurchlauf genau einen Skalar wieder. Also ist das foreach danach dann fehl am Platz. Folgendes macht dann einen chomp:

while ( <> ) {
    chomp; # wenn man nix dazu schreibt, muß $_ gemeint sein.

    ... # tu was sinnvolles, finde eventuell auch ein Abbruchkriterium fuer last();
}

Ersteinmal eine andere Baustelle. Ich versuche gerade eine 2. sub zu bauen, die das Datum abfragen soll und diese aus der Sub in die nächste sub übergeben soll.

sub session_date {
 print "Geben Sie das Datum ein (yyyy/mm/dd): \n";
 while (<>) {
        chomp;
        print"$_  \n\n " ;
            }
      return $session_date;
}; # End sub session_date

Sinn und Zweck soll sein, dass ich die sub session_date als erstes laufen lassen und dann das Datum einlesen kann und dieses in die sub session_id mit übernehmen kann.

  • Wie kann ich eine Variable und deren Wert aus einer an eine andere sub übergeben lassen? --Mario Schröder
say( get_one(), get_two( qw( zwei Worte und noch mehr ) ) );

sub get_one {
    return @_ if @_;
    return 1;
}

sub get_two {
    my ( $erstes, $zweites ) = @_;
    return ( $erstes, $zweites );
}

sub say {
    print "$_\n" for @_;
}

Hmmm, damit muss ich mich in Zukunft wohl noch etwas mehr mit beschäftigen.

Logdateien durchforsten

Wieder einmal will ich als Einsteiger meine Problemchen mit Perl lösen. Und nur Hilfe keine kompletten Lösungen, denn der Weg ist das Ziel.

  • Ziel

Ich würde gerne eine Logdatei mit einem einzulesenden Datum mit diesem als Suchmuster durchsuchen. Die Treffen sollen in eine andere Datei ausgegeben werden. Allerdings kommt im 2. Schritt erschweren hinzu, dass nach der Zeile mit dem Datum 3 weitere Zeilen folgende, die ebenfalls interessant sind und leider kein Datum enthalten - zwischen den Einträgen sind mehrere \n Zeichen bis der nächste Eintrag wieder mit dem Datum beginnt.

  • Idee

Ich lesen die Logdatei von der Kommandozeile ein, ebenso das Datum (=suchstring) Danach öffne ich die Datei (nur lesen - und hoffentlich richtig) und übergebe diese an einen Array von dem aus Zeilenweise die Infos an den suchstring übergeben werden und bei einem Treffer ersteinmal auf der STDOUT ausgegeben werden.

  • Skript

#!/usr/bin/perl -w use strict; use warnings;

Username: