Rückgabe

Von: , Frage gestellt am Fr, 15. Nov 2002

Hallo,

my $ipadresse;
open(FIRE, "d:/syslog.txt");
while(<FIRE>)
{
if (m/IP address is/)
{
$_ =~/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
print "\n$1"; # OK, wird angezeigt
$ipadresse=$1;
}
}
close(FIRE);
print "Aktuelle IP-Adresse:\t $ipadresse";
# diese Zeile wird nicht angezeigt ?

Nur letzte Übereinstimmung brauche ich.
Wo liegt mein Denkfehler?

Danke Ralf

3 Antworten zu dieser Frage

  1. Antwort von nach 3 Stunden 0 hilfreich
    Re: Rückgabe

    Hi Ralf (ich bin's schon wieder),

    kann es sein, daß evtl. eine Zeile zwar den ersten Test betsteht (--> m/IP address is/), aber beim 2. Mal, wo die IP-Adr. gesucht wird, durchfällt? In der Ausgabe (--> print "\n$1";) würden dann Leerzeilen erscheinen, weil der 'Nicht-Match' dazu führt, daß $1 geleert wird...

    Immerhin eine Möglichkeit. Vielleicht solltest du die Zuweisung nur dann machen, wenn $1 einen Inhalt hat.

    Gruß
    bernhard

    • Antwort von nach 7 Stunden 0 hilfreich
      Re^2: Rückgabe

      Hi Bernhard (ich bin's schon wieder), kann es sein, daß evtl. eine Zeile zwar den ersten Test
      betsteht (--> m/IP address is/), aber beim 2. Mal, wo die
      IP-Adr. gesucht wird, durchfällt? In der Ausgabe (--> print
      "\n$1";) würden dann Leerzeilen erscheinen, weil der
      'Nicht-Match' dazu führt, daß $1 geleert wird...
      Leider nein. Ich gebe zum Test die gefunden IP's in eine
      KONTROLL_DATEI aus. Das funktioniert.

      Ich habe die Logdatei von Hand editiert:
      nur 3 Zeilen mit denselben Inhalt. syslog.txt :

      2002.14.11-18:32:54 bingo.network.local, PPP: A: local IP address is 212.144.111.231, remote is 145.253.1.45<-ENDE
      2002.14.11-18:32:54 bingo.network.local, PPP: A: local IP address is 212.144.111.231, remote is 145.253.1.45<-ENDE
      2002.14.11-18:32:54 bingo.network.local, PPP: A: local IP address is 212.144.111.231, remote is 145.253.1.45<-ENDE

      (Zeilenumbruch... Hallo wer-weiss-was,
      kann man das Fenster nicht größer machen?)

      ****************************************************
      #!/usr/bin/perl -w
      # Anfängerprogramm ! noch nicht fertig
      # Für alle Bintecrouter mit
      # Flatrate (Aktivierung der Syslog)

      # Ziel des Programms:
      # Feststellen der IP die der ISP zur
      # Verfügung stellt, um Sie dann in einer neuen HTML-Seite zu
      # hinterlegen.
      # Somit kann man eine Verbindung zu seinen System aufbauen zu
      # können. (Terminal, Web, u.s.w. )

      # Aktivierung der Onlineverbindung
      # (könnte auch eine andere IP sein
      system("ping -n 1 -w 1 200.200.200.200");
      # (soll später durch eigenes PING-Programm
      # ersetzt werden )

      # So sieht das DOS-Fenster aus:
      # Starte Syslogdaemon Logfile nach D:\syslog.txt
      # Syslogd 1.1
      # Copyright (c) 2000, Herbert Hanewinkel, Neuried
      # [E-Mail-Adresse entfernt]
      # www.heha.cjb.net
      # syslogd: listening on port 514

      ----------------------------------------------------------
      # Die oberen Zeilen könnte man sich auch, durch den
      # Einsatz von SNMP sparen wenn.

      # Programmidee: (soweit bin ich noch nicht)
      # SNMP-Abfrage: bist du Online ?
      # ifOperStatus=1.3.6.1.2.1.2.2.1.8

      # SNMP-Abfrage: welche IP hast du?
      # internetadresse=1.3.6.1.4.1.272.4.3.10.1.10.10001.0
      ----------------------------------------------------------

      # öffnen der Datei syslog.txt
      open(KONTROLLE_DATEI, '>d:\neue_ip.txt');
      open(FIRE, "d:/syslog.txt");

      while(<FIRE>)
      {
      if (m/IP address is/) # abgewiesen?
      {
      $_ =~/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
      print "\n$1";
      print KONTROLLE_DATEI "$1\n";
      }
      }
      close(FIRE);
      close(KONTROLLE_DATEI);
      print "\n*************\n";
      print "Aktuelle IP-Adresse:\t$1";

      # Nun erfolgt die Einbindung der IP-Adresse
      # in eine HTML-Seite.

      # Versende autom. (per FTP) die HTML-Seite, wenn sich die IP-
      # Adresse geändert hat.
      ****************************************************

      Gruß
      ralf

      • Antwort von nach 2 Tagen 0 hilfreich
        Re^3: Rückgabe

        Hi Ralf,

        ich mußte selbst ein wenig in meiner Erinnerung kratzen, aber die Lösung liegt wohl im 'dynamic scope' der Variablen $1 etc.

        Im Camelbook findet sich die folgende Erklärung:

        $`, $&, $', and the numbered variables are global variables implicitly localized to the enclosing dynamic scope. They last until the next successful pattern match or the end of the current scope, whichever comes first. More on this later, in a different scope.

        --> d.h. außerhalb des akutellen 'dynamic scopes' (in diesem Fall der if-Block) ist die Variable $1 nicht mehr definiert, und deswegen LEER!

        Macht man es dagegen so, klappts auch wieder.

        #! /soft/perl5/bin/perl
        # (Achtung mein Perl-Pfad ist anders)
        #
        # ich hole mir die Daten nicht aus einer Kontrolldatei, sondern
        # aus der DATA-Section des Scripts
        while(<DATA>)
        {
        if (m/IP address is/) # abgewiesen?
        {
        $_ =~/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
        $lastfoundip = $1;
        }
        }
        print "IP-Adresse:\t$lastfoundip\n";
        __DATA__
        local IP address is 212.144.111.231, remote is 145.253.1.45<-ENDE
        local IP address is 212.144.111.231, remote is 145.253.1.45<-ENDE
        local IP address is 212.144.111.231, remote is 145.253.1.45<-ENDE
        


        (die Zeilenbreite ist wirklich ein Problem, ich habe auch ein wenig abgeschnitten).

        In dieser Variante funktionierts bei mir.

        Gruß
        bernhard

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!