Thread Regex ausdrücke und bestimmte Zeile machen Probleme (12 answers)
Opened by orlando2016 at 2015-04-29 19:49

Raubtier
 2015-04-29 22:19
#180878 #180878
User since
2012-05-04
1076 Artikel
BenutzerIn
[default_avatar]
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
Code (perl): (dl )
1
2
3
4
open (FILE, '<', 'Beispiel_Liste.txt') or die "$!";

 open(OUT,"> Sortiert.txt")
 or die "Fehler beim Öffnen von 'Sortiert.d': $!\n";


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)

Quote
Code (perl): (dl )
while($_ = <FILE>)
Benenne die Variable doch! z.B. $line = <$fh>

Quote
Code (perl): (dl )
1
2
{ 
  if($_ =~ /Geburtuhrzeit [0-9].[0-9].*[0-9]*.*[0-9]*.*[0-9]*.*[0-9]*/)

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 Perldoc:perlretut.

Quote
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
  {
        my @zeile = split(/\s|\.|\//, $_);
               $year           = $zeile[1];
               $month          = $zeile[2];
               $day            = $zeile[3];
               $hour           = $zeile[4];
               $minute         = $zeile[5];
               $second         = $zeile[6];
        #       print "$_"; 
Das kannst du einfacher haben:
my (undef, $year, $month, $day) = split ...

Quote
Code (perl): (dl )
                if (($year == 1999) && ($month == 07) && ($day ==31)) 
Achtung: Zahlen mit führender 0 sind Oktal-Zahlen!

Quote
Code (perl): (dl )
       foreach ($startwert; $startwert < $zeilennr ; $startwert ++)

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...

View full thread Regex ausdrücke und bestimmte Zeile machen Probleme