Thread Regex ausdrücke und bestimmte Zeile machen Probleme
(12 answers)
Opened by orlando2016 at 2015-04-29 19:49
Hallo Orlando,
an deinem Script gibt es viel zu kritisieren. Zunächst einmal fehlt auch die Beschreibung, was es denn eigentlich tun soll. Ich nehme an, es soll die Datensätze heraussuchen, bei denen das Geburtsdatum 1999-07-31 ist? Dann hatte ich hier eine auf 2 (!) Codezeilen (+Boilerplate) verkürzte Version, die das erledigt (für das Beispiel habe ich die Datensätze gleich mittels __DATA__ mit in den Code geschrieben): Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 use 5.14.0; use warnings; my @datensaetze = split /\n\n/, do { local $/; <DATA> }; say "$_\n" for grep /^Geburtuhrzeit 1999\.07\.31\.\d\d\.\d\d\.\d\d$/m, @datensaetze; __DATA__ Fabian Geburtuhrzeit 2013.07.03.15.19.28 Gewicht... HÖhe.... Seit... Marion Geburtuhrzeit 2013.07.03.15.20.26 Gewicht... HÖhe.... Seit... Hajo Geburtuhrzeit 1999.07.31.21.29.53 Gewicht... HÖhe.... Seit... weitere Info.. Heino Geburtuhrzeit 1999.07.31.21.30.36 Bekannt nur: Seit.... Im folgenden gebe ich ein paar Verbesserungsvorschläge: 2015-04-29T17:49:19 orlando2016 0. Jedes Script sollte use strict; (ab use 5.12.0; enthalten) und use warnings; enthalten. 1. Bei open bitte immer die 3-Argumente-Form verwenden, wie du das oben gemacht hast. Das vermeidet einfach Fehler. 2. Außerdem solltest du keine globalen Dateihandles nehmen, sondern normale lexikalische Variablen. Also open my $fh, '<', 'datei' or die $!; Es hilft auch oft, den Dateinamen in eine Variable zu schreiben, damit Fehlermeldung und tatsächlich geöffnete Datei auch übereinstimmen ;-) (bei dir: Sortiert.txt vs. Sortiert.d) QuoteBenenne die Variable doch! z.B. $line = <$fh> Quote Ein Punkt matcht alle Zeichen. Daher \. verwenden, wenn du einen Punkt matchen willst. .* matcht dir alles bis ans Zeilenende weg, die restlichen Gruppen mit * sind somit alle leer. Außerdem ist das ganze nicht verankert. Effektiv ist deine RE also identisch mit /Geburtuhrzeit [0-9].[0-9]/ Lies am besten mal perlretut. QuoteDas kannst du einfacher haben: my (undef, $year, $month, $day) = split ... QuoteAchtung: Zahlen mit führender 0 sind Oktal-Zahlen! Quote Naja, einmal würde ich nur for statt foreach schreiben, und dann ist mir nicht klar, das da eigentlich gemacht werden soll... Du schreibst jedes Mal dieselben Daten raus. Ich hoffe, geholfen zu haben... |