Set $/ to regex

05/09/2012 - 21:06 von mstep | Report spam
Hallo an alle!


Kurz:

Ich versuche gerade - vergeblich - den "Input record separator" mit einem regex zu schreiben:

$/ = qr/\t+/

Ist das möglich?

Lang:

Ich versuche folgende Daten zu verarbeiten, Input:


Sam, 28.07.2012 42523.00 25765.39 1989 1809.50 36616.50
Son, 29.07.2012 42523.00 25765.39 1989 1809.50 36616.50
TOTAL 0.00 0.00 0 0.00 0.00 0.00 0.00

Son, 29.07.2012 42523.00 25765.39 1989 1809.50 36616.50
Mon, 30.07.2012 5:20-23:00 17:40 42916.50 25962.09 1994 1809.50 36926.40
TOTAL 393.50 196.70 5 0.00 309.90 85.00 394.90

Mon, 30.07.2012 42916.50 25962.09 1994 1809.50 36926.40
Die, 31.07.2012 5:20-22:00 16:40 43205.00 26100.39 1997 1809.50 37137.30
TOTAL 288.50 138.30 3 0.00 210.90 55.00 265.90

Die, 31.07.2012 43205.00 26100.39 1997 1809.50 37137.30
Mit, 01.08.2012 9:30-23:00 13:30 43415.50 26162.79 2003 1809.50 37254.90
TOTAL 210.50 62.40 6 0.00 117.60 0.00 117.60


Output:

Son, 29.07.2012
Mon, 30.07.2012 5:20-23:00 17:40 393.50 196.70 5 0.00 309.90 85.00 394.90
Die, 31.07.2012 5:20-22:00 16:40 288.50 138.30 3 0.00 210.90 55.00 265.90
Mit, 01.08.2012 9:30-23:00 13:30 210.50 62.40 6 0.00 117.60 0.00 117.60

Problem ist, dass die Leerzeile zwischen den Block ("Paragraph") mit tabs gefüllt sind.

Mein Script funktioniert nur, wenn ich zuvor die \t in den Leerzeilen entferne:


#!/usr/bin/perl

use strict;
use warnings;

my @date;
$/ = "";

while (<DATA>) {
if (/^.+([a-z]+, \d\d\.\d\d\.\d{4}\t)([-:\d]+\t[\d:]+\t).+TOTAL\t+([\d.\t ]+)/i) {
push @date, $1 . $2 . $3;
}
elsif (/^[a-z]+, \d\d\.\d\d\.\d{4}.+([a-z]+, \d\d\.\d\d\.\d{4})\t\t/i) {
push @date, $1;
}
}

print join( "", @date );

__DATA__

Sam, 28.07.2012 42523.00 25765.39 1989 1809.50 36616.50
Son, 29.07.2012 42523.00 25765.39 1989 1809.50 36616.50
TOTAL 0.00 0.00 0 0.00 0.00 0.00 0.00

Son, 29.07.2012 42523.00 25765.39 1989 1809.50 36616.50
Mon, 30.07.2012 5:20-23:00 17:40 42916.50 25962.09 1994 1809.50 36926.40
TOTAL 393.50 196.70 5 0.00 309.90 85.00 394.90

Mon, 30.07.2012 42916.50 25962.09 1994 1809.50 36926.40
Die, 31.07.2012 5:20-22:00 16:40 43205.00 26100.39 1997 1809.50 37137.30
TOTAL 288.50 138.30 3 0.00 210.90 55.00 265.90

Die, 31.07.2012 43205.00 26100.39 1997 1809.50 37137.30
Mit, 01.08.2012 9:30-23:00 13:30 43415.50 26162.79 2003 1809.50 37254.90
TOTAL 210.50 62.40 6 0.00 117.60 0.00 117.60
 

Lesen sie die antworten

#1 Ralf Döblitz
05/09/2012 - 21:35 | Warnen spam
schrieb:
Hallo an alle!


Kurz:

Ich versuche gerade - vergeblich - den "Input record separator" mit
einem regex zu schreiben:



Aus perlvar(1):
| Remember: the value of $/ is a string, not a regex. awk has to be
| better for something. :-)


$/ = qr/\t+/

Ist das möglich?



Nein.

Ralf
[Abhàngen von Kruzifixen in Rechnerràumen]
Nicht opportun. Normalerweise haengt an diesen Kruzifixen ja schon jemand.
Wurde Jesus gelartet?
  – Jens Chr. Bachem in de.alt.sysadmin.recovery

Ähnliche fragen