Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12722[/thread]

Fehler beim Ausgabe einlesen

Leser: 1


<< >> 7 Einträge, 1 Seite
Gast Gast
 2008-11-05 12:55
#115986 #115986
Hi zusammen,

bin noch Perl-Anfänger.
Würde gerne eine Ausgabe zeilenweise einlesen und mit Pattern vergleichen.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
open (NAVI ,"$Ausgabe");
my $sp_line = 0;
while (<NAVI>){
if ($_ =~ m/^DPE|^SPE/ ) {
$sp_line=1;
}
if ($sp_line == 1) {
if($_ =~ m/^SP/ ) {
if ($1 =~ m/Present/) {
print "Treffer";
exit (0)
} else {
print "kein Treffer \n";
exit (1)
}
}
}


Jetzt kommt immer die Fehlermeldung:
Use of uninitialized value in pattern match (m//) at line 67, <NAVI> line 1.

In Line 67 steht 'if ($1 =~ m/Present/) {'
Aber ich muss doch die Variable $1 nicht bzw. kann ich nicht initialisieren.

Kann ir da jemand weiterhelfen, danke
renee
 2008-11-05 13:16
#115987 #115987
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Die Variable $1 ist eine Spezialvariable in Perl. Diese wird gesetzt, wenn Du in einem matchenden Regulären Ausdruck Klammern verwendest.

Z.B.

Code (perl): (dl )
1
2
3
if( $_ =~ m!^(SP)! ){
    print $1;
}


Du verwendest aber diese Klammern nicht, damit ist in $1 kein Wert gespeichert. Die Warnung mit "uninitialized value" ist etwas blöd, besser wäre ein "undefined value". (Ist auch ein bei den Perl 5 Porters schon bekanntes Problem)

Ich nehme an, dass Du eher $_ statt $1 gemeint hast.

Noch eine Anmerkung: Wenn Du eine Datei öffnest, solltest erstens angeben, ob Du sie lesend oder schreibend öffnest und zum anderen solltest Du Fehler abfangen.

Lexikalische Filehandles haben auch noch Vorteile und in der while-Schleife solltest Du eine lexikalische Variable nehmen.

Also:
Code (perl): (dl )
1
2
3
4
5
open my $fh, '<', $Ausgabe or die "$Ausgabe: $!";
while( my $line = <$fh> ){
  # und jetzt immer $line statt $_ verwenden
}
close $fh;
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2008-11-05 13:22
#115988 #115988
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ein Lesetipp:

* Wiki:Was ist ein lexikalischer Filehandle?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2008-11-05 14:40
#115996 #115996
hi,

alles klar, danke!

gruß
Gast Gast
 2008-11-05 15:02
#116000 #116000
ich komme mit den Pattern einfach nicht so klar,

ich möchte z.B. nach dem Ausdruck 'Present' im folgenden Output suchen:

SP A State: Present

das mache ich mit:

Code: (dl )
1
2
3
4
5
if($line =~ m!^(SP)\s+[AB]\w+:s+\w+!) {
if ($1 =~ m/(Present|Valid)/) {
print "Status Array: $1 \n";
}
}


aber die Ausgabe ist leer!
Habe jetzt schon die verschiedensten Varianten versucht.
kannst du mir da weiterhelfen, danke[b]
renee
 2008-11-05 15:26
#116002 #116002
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Nimm $line statt $1 in dem zweiten if...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2008-11-05 15:34
#116003 #116003
hi,

danke, habe es auch so gemacht.

Kann man für einen Pattern auch eine Variable hinterlegen.

z.B.

Code: (dl )
if( $_ =~ m/^SP\s$opt_sp\s\w+:\s+(\w+)/)


die Variable $opt_spp kann unterschiedlich sein.

danke
<< >> 7 Einträge, 1 Seite



View all threads created 2008-11-05 12:55.