Schrift
[thread]12974[/thread]

regex funktioniert einmal, beim zweiten Mal nicht



<< >> 4 Einträge, 1 Seite
McSvenster
 2009-01-09 21:20
#117808 #117808
User since
2008-11-19
12 Artikel
BenutzerIn
[default_avatar]
Liebe Kollegen,

ich möchte Euch mal wieder um Hilfe bitten. Zur Zeit zweifele ich an meinem Verstand, da eine regex bei einer Variablen funktioniert, wie erwartet, bei einer anderen aber nicht.
Mein Skript habe ich hier mal nur auf die Funktion zusammengekürzt:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my $ParamZahl = @ARGV;
if ($ParamZahl == 2 && @ARGV[0] =~ /^\D{3}$/ && @ARGV[1] =~ /^\d{4}$/ ) {
  $Biblio=@ARGV[0];
  $Jahr=@ARGV[1]; 
  print "$Biblio im Jahr $Jahr \n";
  }
  else {
    print "Die Parameter sind falsch eingegeben worden.\n";
        print "Bitte die Bibliothek angeben (BBB): ";
        my $Biblio = <STDIN>;
        while ($Biblio !~ /^\D{3}$/ ){
          print "Bitte die Bibliothek mit drei Buchstaben eingeben (BBB) : ";
          $Biblio = <STDIN>;
  }
} 


Ich möchte dem Perlscript bei Aufruf zwei Parameter übergeben und diese (erstmal grob) überprüfen. Dabei darf der erste Parameter nur genau aus drei Buchstaben bestehen, der zweite genau aus vier Ziffern.
Das funktioniert bei der if- Abfrage auch. In der while- Schleife aber akzeptiert das Skript nun auch zwei Buchstaben (drei gehen auch, einer wird abgewiesen und ab vier ebenfalls die Schleife wie gewünscht durchlaufen).

Hat jemand einen Tipp für mich?

Grüße
Mc
Linuxer
 2009-01-09 21:27
#117811 #117811
User since
2006-01-27
3871 Artikel
HausmeisterIn

user image
Wenn Du Daten vom Benutzer via STDIN abfragst, dann solltest Du den abschliessenden Newline entfernen oder entsprechend berücksichtigen.

Code (perl): (dl )
chomp ( my $input = <STDIN> );


Und dein Regex ist das weitere Problem.

\D steht für alle Nicht-Ziffern, also auch für Space, Tab, Newline etc.

Deshalb wird eine Angabe von "zwei Buchstaben und ein Enter" akzeptiert.

Wenn Du nur Buchstaben haben willst, solltest Du das auch so formulieren.

Code (perl): (dl )
m/^[a-zA-Z]{3}$/
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
McSvenster
 2009-01-09 21:30
#117812 #117812
User since
2008-11-19
12 Artikel
BenutzerIn
[default_avatar]
Danke Dir für die schnelle Antwort! Den chomp hatte ich versucht - der hat es nicht geändert. Bei der regex war ich erstmal nur tippfaul ;-) ich versuche es gleichmal mit echten "nur Buchstaben".

Melde mich dann, ob es geklappt hat.

09.01.09, 20:32 Uhr: Nachtrag: so funktioniert es. Herzlichen Dank! Das war auch genau der richtige Hinweis: Dadurch das oben die Parameter übergeben werden, ist kein newline o. Ä. drin, unten hatte ich mich vorher beim chomp vertippt...
Gruß
Mc
pq
 2009-01-10 00:56
#117818 #117818
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
bitte zukünftig unbedingt strict und warnings benutzen. info dazu findest du hier:
Wiki:UseStrict
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< >> 4 Einträge, 1 Seite



View all threads created 2009-01-09 21:20.