Schrift
[thread]3002[/thread]

Perl-script: Reguläreausdrücke



<< >> 8 Einträge, 1 Seite
bloonix
 2006-01-26 15:44
#28389 #28389
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=svenXY,26.01.2006, 14:37]
Code (perl): (dl )
if (m/^(\d+)\s+~?(\d+)\s+(\d+)\s+(\d+)/g){

[/quote]

Das 'g' am Ende kann aber getrost weggelassen werden.\n\n

<!--EDIT|opi|1138283106-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
svenXY
 2006-01-26 15:32
#28390 #28390
User since
2005-09-15
33 Artikel
BenutzerIn
[default_avatar]
Hi,

ich würde das mit split machen.
Etwa so:
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
use strict;

my @records;
my (&#36spalte1, &#36spalte2, &#36spalte3, &#36spalte4);

my &#36dossier= "/home/blabla/datei.txt";

open(ENTREE,"&#36dossier")or die "can't open this File &#36!";
while(<ENTREE>){
  chomp;
  if (&#36. == 1) {
    (&#36spalte1, &#36spalte2, &#36spalte3, &#36spalte4) = split(/\s+/, &#36_);
  }
  else {
    my(@zahlen) = split(/\s+/, &#36_);
    push(@records, { &#36spalte1 => &#36zahlen[0], &#36spalte2 => &#36zahlen[1], &#36spalte3 => &#36zahlen[2], &#36spalte4 => &#36zahlen[3]  });
  }
}
close ENTREE;

use Data::Dumper;
print Dumper(\@records);


Ergebnis wäre dann:
Code: (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
$VAR1 = [
{
'AR-BASE' => '0',
'CAE-PACK' => '0',
'EMS-PACK' => '0',
'case' => '1'
},
{
'AR-BASE' => '0',
'CAE-PACK' => '1',
'EMS-PACK' => '1',
'case' => '2'
},
{
'AR-BASE' => '~0',
'CAE-PACK' => '0',
'EMS-PACK' => '0',
'case' => '3'
},
{
'AR-BASE' => '~0',
'CAE-PACK' => '1',
'EMS-PACK' => '1',
'case' => '4'
}
];


Gruss,
Sven\n\n

<!--EDIT|svenXY|1138286496-->
bloonix
 2006-01-26 17:43
#28391 #28391
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Aber warum ein Array erzeugen, wenn man die Zeile direkt in
den Hash aufteilen und sich das Array sparen könnte?
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
svenXY
 2006-01-27 12:02
#28392 #28392
User since
2005-09-15
33 Artikel
BenutzerIn
[default_avatar]
[quote=opi,26.01.2006, 16:43]Aber warum ein Array erzeugen, wenn man die Zeile direkt in
den Hash aufteilen und sich das Array sparen könnte?[/quote]
Ich war mir nicht ganz sicher, ob er das "case" Feld nicht vielleicht auch im Hash drinhaben woollte, deswegen der AoH.

Du hast aber Recht, besser ist sicherlich sowas wie

Code (perl): (dl )
1
2
3
...
my(@zahlen) = split(/\s+/, &#36_);
    &#36records[&#36zahlen[0]] = { &#36spalte2 => &#36zahlen[1], &#36spalte3 => &#36zahlen[2], &#36spalte4 => &#36zahlen[3]  };


Gruss,
Sven
Gast Gast
 2006-01-26 14:46
#28393 #28393
guten Tag an alle ; ich habe ein Problem einDatei mit Perl automatischzu erstellen; ich bin zwar ein Anfänger was diese Sprache angeht; mein Datei sieht so aus :

case AR-BASE CAE-PACK EMS-PACK
1 0 0 0
2 0 1 1
3 ~0 0 0
4 ~0 1 1



ich möchte jeweils pro zeile Jedes Dezimal Zahl in einer Variable speichern und dafür habe zuerst die Datei geöffnet und iteriere über die Ganze Datei und mache ein "Match" leider funktioniert es nicht richtig ! wo ist das Problem in meinem Code ?

my $dossier= "/home/blabla/datei.txt";

open(ENTREE,"$dossier")or die "can't open this File $!";
while(<ENTREE>){
chomp;
if(m/(^?\d{1,})(.\d?)(.[0-1]{1})([^~]\d{1})/g){
dann mag etwas !!!

}
}

ich würde micht freuen falls irh mir weiter helfen würdest !!

Gruss.

Grad
svenXY
 2006-01-26 15:37
#28394 #28394
User since
2005-09-15
33 Artikel
BenutzerIn
[default_avatar]
aber mit Deinem Code würde es auch (fast) gehen:
Code: (dl )
1
2
3
4
5
6
7
# match 1 (Klammern) in $1 usw.
if (m/^(\d+)\s+~?(\d+)\s+(\d+)\s+(\d+)/g){
$var1 = $1
$var2 = $2
$var3 = $3
$var4 = $4
)
\n\n

<!--EDIT|svenXY|1138282908-->
Strat
 2006-01-26 17:37
#28395 #28395
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn es sich um daten mit fixer Satzlaenge handelt, ist split meistens der falsche Weg. da besser unpack verwenden, z.B.
Code: (dl )
my (@columns) = unpack("A5 A7 A3 A9", $line);

perldoc -f unpack ist sehr lesenswert, weil das eine menge toller optionen fuer sowas bietet. A ist zwar schon sehr hilfreich, aber es gibt noch eine Menge mehr, die oft die Arbeit sehr erleichtern.\n\n

<!--EDIT|Strat|1138289853-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Dubu
 2006-01-26 23:03
#28396 #28396
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Strat,26.01.2006, 16:37]perldoc -f unpack ist sehr lesenswert, [...][/quote]
Man vergesse nicht perlpacktut!
<< >> 8 Einträge, 1 Seite



View all threads created 2006-01-26 15:44.