Thread Ausgabe aus Array (10 answers)
Opened by tejste at 2012-11-15 17:36

topeg
 2012-11-16 10:40
#163333 #163333
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Es ist richtig Perl benutzt "\n" als Zeilentrenner, wenn nichts anderes Angeben ist. Unter Windows ist das "\x0D\x0A" unter Linux/Unix "\x0A". Je nach OS kann der Trenner anders sein. XML Auf der anderen Seite kennt keine Zeilen und damit Zeilentrenner. Alle Umbrüche werden wie Leerzeichen behandelt. Das bedeutet für dich, du kannst dir nicht sicher sein, dass eine Zeile auch immer einen Datensatz enthält und das der Zeilentrenner immer dem entspricht was auf dem System verwendet wird.
Ich nehme mal an das du das alles weißt und geprüft hasst. Alle Datensätze sind gleich formatiert sind und die Zeilenumbrüche korrekt erkannt werden.

Das einlesen aller Zeilen in ein Array um dann ein paar wenige Zeilen auszugeben ist nicht sonderlich sinnvoll. Du packst ~110000Byte in den Speicher um ein paar Byte auszugeben. In dem Fall ist es sinnvoller eine Zeile zu lesen, diese zu prüfen und dann aus zu geben.

Das hier my $seek=~m/UserName(.+)/; prüft ob undef "UserName"mit zusätzlichen Zeichen enthält.
Was du vermutlich willst ist:my $seek=qr/UserName(.+)/; qr erzeugt (vorkompiliert) einen regulären Ausdruck. =~ wendet ihn an.

for(my $i=0; $i<=$#vektor; $i++) Das ist eine umständliche Schreibweise für for my $i (0..$#vektor)

Was du eher schreiben solltest ist:
Code (perl): (dl )
1
2
3
4
5
6
7
for my $line (@vektor)
{
  if($line=~$seek)
  {
    print $1;
  }
}


Insgesamt sollte der Code besser so aussehen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use strict;
use warnings;

my $logfiles = 'C:\test\xunix\logfile_tracefiles\TraceLog_.txt';
my $seek = qr/UserName(.+)/;

$/="\x0A"; # gemeinsamer Nenner für Windows/Linux/Unix
open(my $fh, '<', $logfiles) or die "Can't open $logfiles ($!)\n";
while(my $line=<$fh>)
{
  if($line=~$seek)
  {
    print $1;
  }
}
close($fh);

View full thread Ausgabe aus Array