SkÃ¥ne Sjælland Linux User Group - http://www.sslug.dk Forside   Tilmelding   Postarkiv   Forum   Kalender   Søg
MhonArc Dato: [Date Prev] [Kronologisk oversigt] [Date Next]   TrÃ¥d: [Date Prev] [Oversigt trÃ¥de] [Date Next]   MhonArc
 

Re: [PERL] regulære udtryk (evt split?)



> Men jeg synes ikke linien er specielt køn, er det muligt at lave noget
> bedre? Jeg har prøvet med ting såsom (([\d\*]+)\s+){15}, men så kan
> jeg ikke finde ud af at 'fange' værdierne på de 15 pladser.

Nej, i så fald får du kun fanget den 'sidste' match (ud af de 15).

> Jeg har spekuleret en anelse på at benytte 'split' i stedet, men er
> det mon muligt når jeg ikke ved hvor mange blanke tegne der er imellem
> de forskellige tal/stjerner?

Ja, det kan du godt:

   @array = split /\s+/, $data;

og så har du dine tal/stjerner i @array. Efterfølgende kan du så
kontrollere om der er 15 af dem

   die "Horrible!\n" unless @array == 15;

og du kan endda kontrollere om de enkelte elementer har det korrekte
format:

   @array = map { /^([\s\*]+)$/ } @array;
   die "Even more painfull!\n" unless @array == 15;

Måske lige et ord om den der map ting: map løber igennem array, og på
hver plads udfører den koden i {}'erne med $_ sat til at være et alias
for elementet i @array. Eftersom regexp'en indeholder paranteser,
evaluerer den til elementet hvis det passer med syntaxen og undef ellers.
Du kunne også lave

   @array = map { /^[\s\*]+$/ ? $_ : 'BAD' } @array;
   die "You had $c bad entries\n" if $c = grep {/BAD/} @array;

   
> Kort sagt, findes der ikke et pænt og kort regulært udtryk, som kan
> fange de 15 værdier?

Hmm. Hvad med at snyde lidt:

  $re = '^' . '([\s\*]+)\s+' x 14 . '([\s\*]+)$';
  print join ':',$data =~ /$re/;

:-)

mvh

 - Peter

-- 
ln -s /dev/random ~/.plan


 
Forside   Tilmelding   Postarkiv   Oversigt   Kalender   Søg

 
 
Henvendelse vedrørende websiderne til <www_admin>. Senest ændret 2005-08-10, klokken 19:53
Denne side vedligeholdes af MHonArc .