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