356speedster Skrevet 25. januar 2005 Del Skrevet 25. januar 2005 Skal utvikle et script som bla skal tolke en tekststreng og dele opp den til forskjellige verdier (dere fra mobilbransjen kjenner dere sikkert igjen). Jeg vet at en tekststreng som har et skilletegn som f.eks mellomrom, enkelt kan splitttes opp til enkeltverdier. Eksempel på tekstsreng: a12 x22 g32 Men det jeg er ute etter er muligheten for å kunne motta tekststrenger både med og uten skilletegn men som følger et fast mønster (bokstav-tall-bokstav-tall,etc...) men hvor det er både med og uten mellomrom mellom verdiene. Eksempel på tekstsreng: a12 x22g32 eller a12 x 22g32 etc... Man kan si følgende: alle tall etter en bokstav er verdien til den bokstaven. Trenger ikke koden her og nå, men vil gjerne vite om dette lar seg gjøre i Perl. Lenke til kommentar
mysjkin Skrevet 25. januar 2005 Del Skrevet 25. januar 2005 Er det noe perl virkelig exellerer i, så er det å plukke tekststrenger i fillebiter for å få ut informasjon. Så til hovedspørsmålet ditt: Ja, med tre streker under svaret. For å sitere: "Perl is designed to make the easy jobs easy and the hard jobs possible." -Larry Wall Neste spørsmål, hvordan... Jeg ser to muligheter enten en regex, sannsynligvis det lureste, dersom datastrukturen er for komplisert, kan det være at du må til med Parse::RecDescent , det som ikke den klarer å plukke ut info av, finnes det ingen strukturert info i... For mer info, kan du se på http://www.perldoc.com/perl5.8.4/pod/perlre.html om regexper, eller http://search.cpan.org/~dconway/Parse-RecDescent-1.94/ M. Lenke til kommentar
sam2 Skrevet 28. januar 2005 Del Skrevet 28. januar 2005 Dette kan enkelt løses vha split-kommandoen og en passende regexp.. split /En_passende_regexp/, $data; Lenke til kommentar
mysjkin Skrevet 28. januar 2005 Del Skrevet 28. januar 2005 (endret) Ja, du har vel rett, dersom det går an å bruke look-behind og look-ahead i en split-regexp (ja hvorfor skulle det ikke..) Burde kunne få ut elementene med split/(?<=\d)\s*(?=\D)/ $inndata; Mao den klipper opp der hvor ingen eller flere mellomrom står etter et tall og før et ikke tall.. M. (Må lære meg å tenke litt mindre komplisert av og til...) Edit: kodekodekode: $inndata="a12 x22g32 "; @arry=split /(?<=\d)\s*(?=\D)/, $inndata; foreach (@arry){ print "$_\n"; } Jupp, det funker. (Beklager speedster, du sa du ikke ville ha noe kode, men jeg klarte ikke å la være....) I neste runde klipper du opp enkeltstrengene (vha substr eller sprintf dersom det alltid er en bokstav, regexpen over bak fram dersom det kan være flere) Hmm, tilbake til perlkoding av omregning mellom ecef og lat/lon , prøver å bruke Math::BigFloat for å få høy nok nøyaktighet (10 -12 sifre), men det er visst noe jeg ikke har forstått der (enda) M. Endret 28. januar 2005 av mysjkin Lenke til kommentar
superlaban Skrevet 2. februar 2005 Del Skrevet 2. februar 2005 Dette omdanner eksempelstrengen til en hash og skriver 23: $s="a 32x 22 g3bf 23"; %h = $s=~/\s*(\D+?)\s*(\d+)/g; print $h{bf}; Dvs, du har nå en hash som ser slik ut: %h=( a=>32, x=>22, g=>3, bf=>23 ); Lenke til kommentar
356speedster Skrevet 23. februar 2005 Forfatter Del Skrevet 23. februar 2005 (endret) Sliter fortsatt litt med denne. Følgende funker: $inndata="a12 x22g32 "; @arry=split /(?<=\d)\s*(?=\D)/, $inndata; foreach (@arry){ print "$_<br>\n"; } Dette gir en liste som ser slik ut: a12 x22 g32 Dette er forsåvidt greit, men hvordan skiller jeg ut bokstaver og tall? Poenget er at bokstaven skal være "navnet på verdien" og tallet skal være selve verdien. Slik at jeg kan lagre bokstaven i en kolonne og tallet i en annen kolonne i samme rad i databasen. tabellen skal se slik ut: a|12 x|2 g|32 Eller: $bokstav|$tall En annen ting jeg også trenger er at det ikke skal tillates fler enn en bokstav pr tall og heller ikke like bokstaver. Noen som vil hjelpe? Endret 23. februar 2005 av 356speedster Lenke til kommentar
Torbjørn Skrevet 23. februar 2005 Del Skrevet 23. februar 2005 superlaban har da gitt en løsning til deg? Lenke til kommentar
356speedster Skrevet 23. februar 2005 Forfatter Del Skrevet 23. februar 2005 Ok da fant jeg ut av det: print "<table border='1'>"; $s="$input{'message'}"; %h = $s=~/\s*(\D+?)\s*(\d+)/g; foreach my $key (keys %h) { $bokstav=lc($key); $verdi=$h{$key}; print "<tr><td>$bokstav</td><td>$verdi</td></tr>"; } print "</table>"; Takk for å ha ledet meg på sporet :-) Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå