/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
streng manipulation / regular expression ?
Fra : T. Sandbaek


Dato : 11-03-03 14:48

Hej *.perl

Jeg er temmeligt grøn mht. perl, så jeg håber at jeg kan få lidt hjælp til
mit lille problem. Jeg kender C og lidt AWK, men tror at perl er det rigtige
værktøj til dette problem!

jeg har noget C kode som f.x. ser således ud:

#include "char.h"
#include "SInt16.h"
char a[] = "char";
char dd;
signed char a;
unsigned char a;
char a;
myFunc( char a, signed char, unsigned char );

som jeg gerne vil have lavet om til dette:

#include "char.h"
#include "SInt16.h"
Sint16 a[] = "char";
Sint16 dd;
Sint16 a;
unsigned char a;
Sint16 a;
myFunc( Sint16 a, Sint16, unsigned char );

men jeg har ikke rigtig så meget ide om hvordan jeg skal gribe det an. Er
der nogle som kan hjælpe med nogle tips?
og ja, vi har flere type som skal konverteres, men hvis jeg først forstår at
konverter char, kan jeg vel også konverter de andre!

Jeg har lavet noget i AWK men jeg kan ikke få den til at undlade at
konverter tekst i "", og så tænkte jeg at perl måske var bedre, uden at have
så meget andet ide om det....


med venlig hilsen
Torben



 
 
Lars Balker Rasmusse~ (11-03-2003)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 11-03-03 15:38

"T. Sandbaek" <tpn@NO-SPAM-PLEASEcontrol-systems.com> writes:
> Jeg er temmeligt grøn mht. perl, så jeg håber at jeg kan få lidt hjælp til
> mit lille problem. Jeg kender C og lidt AWK, men tror at perl er det rigtige
> værktøj til dette problem!

Naturligvis :)

> jeg har noget C kode som f.x. ser således ud:
>
> #include "char.h"
> #include "SInt16.h"
> char a[] = "char";
> char dd;
> signed char a;
> unsigned char a;
> char a;
> myFunc( char a, signed char, unsigned char );
>
> som jeg gerne vil have lavet om til dette:
>
> #include "char.h"
> #include "SInt16.h"
> Sint16 a[] = "char";
> Sint16 dd;
> Sint16 a;
> unsigned char a;
> Sint16 a;
> myFunc( Sint16 a, Sint16, unsigned char );
>
> men jeg har ikke rigtig så meget ide om hvordan jeg skal gribe det an. Er
> der nogle som kan hjælpe med nogle tips?

Vi er for nemheds skyld nødt til at antage at alle "C-strings"
afsluttes på samme linie. Desuden har jeg ikke taget højde for \" i
strengene[1].

Så vil følgende s/// gøre det du søger:

s{([^"]*)(".*?")?}{
my ($pre, $str) = ($1, $2);
$pre =~ s/(signed\s+)?char/Sint16/g;
$pre =~ s/unSint16/unsigned char/g;
"$pre$str"
}ge;

Ovenstående matcher noget der ikke indeholder ", efterfulgt af noget
pakket ind i "'er, og gentager om nødvendigt matchet flere gange for
samme linie (/g modifieren). Da vi nu har en del af strengen, der
ikke indeholder "'er, kan vi lave den nemme replace på den.

[1] Det kan man gøre ret nemt med s/\\"/\xff/g før og s/\xff/\\"/g
efter udtrykket ovenfor.
--
Lars Balker Rasmussen                  "S.M.R.T."

T. Sandbaek (14-03-2003)
Kommentar
Fra : T. Sandbaek


Dato : 14-03-03 09:53

Hej Lars

Det virker perfekt, det eneste lille problem som jeg har, er at jeg ikke
forstår hvordan det virker. Jeg har forsøgt de sidste par dage at decode
det, men.... stadigt ikke sikker på virke måden. Kan jeg tigge en lille
forklaring på udtrykket?


> s{([^"]*)(".*?")?}{
> my ($pre, $str) = ($1, $2);
> $pre =~ s/(signed\s+)?char/Sint16/g;
> $pre =~ s/unSint16/unsigned char/g;
> "$pre$str"
> }ge;
jeg kan næste regne virke måden ud men s{}, er det det samme som s///?
og hvorfor har du et ? i ".*?" (først linje)
og når der bare står
"$pre$str"
er det så det samme som
$_="$pre$str"



Med venlig hilsen
Torben


"Lars Balker Rasmussen" <lars@balker.org> wrote in message
news:0fof4iaryy.fsf@laphroaig.balker.org...
> "T. Sandbaek" <tpn@NO-SPAM-PLEASEcontrol-systems.com> writes:
> > Jeg er temmeligt grøn mht. perl, så jeg håber at jeg kan få lidt hjælp
til
> > mit lille problem. Jeg kender C og lidt AWK, men tror at perl er det
rigtige
> > værktøj til dette problem!
>
> Naturligvis :)
>
> > jeg har noget C kode som f.x. ser således ud:
> >
> > #include "char.h"
> > #include "SInt16.h"
> > char a[] = "char";
> > char dd;
> > signed char a;
> > unsigned char a;
> > char a;
> > myFunc( char a, signed char, unsigned char );
> >
> > som jeg gerne vil have lavet om til dette:
> >
> > #include "char.h"
> > #include "SInt16.h"
> > Sint16 a[] = "char";
> > Sint16 dd;
> > Sint16 a;
> > unsigned char a;
> > Sint16 a;
> > myFunc( Sint16 a, Sint16, unsigned char );
> >
> > men jeg har ikke rigtig så meget ide om hvordan jeg skal gribe det an.
Er
> > der nogle som kan hjælpe med nogle tips?
>
> Vi er for nemheds skyld nødt til at antage at alle "C-strings"
> afsluttes på samme linie. Desuden har jeg ikke taget højde for \" i
> strengene[1].
>
> Så vil følgende s/// gøre det du søger:
>
> s{([^"]*)(".*?")?}{
> my ($pre, $str) = ($1, $2);
> $pre =~ s/(signed\s+)?char/Sint16/g;
> $pre =~ s/unSint16/unsigned char/g;
> "$pre$str"
> }ge;
>
> Ovenstående matcher noget der ikke indeholder ", efterfulgt af noget
> pakket ind i "'er, og gentager om nødvendigt matchet flere gange for
> samme linie (/g modifieren). Da vi nu har en del af strengen, der
> ikke indeholder "'er, kan vi lave den nemme replace på den.
>
> [1] Det kan man gøre ret nemt med s/\\"/\xff/g før og s/\xff/\\"/g
> efter udtrykket ovenfor.
> --
> Lars Balker Rasmussen "S.M.R.T."



Peter Makholm (14-03-2003)
Kommentar
Fra : Peter Makholm


Dato : 14-03-03 10:03

"T. Sandbaek" <tpn@NO-SPAM-PLEASEcontrol-systems.com> writes:

>> s{([^"]*)(".*?")?}{
>> my ($pre, $str) = ($1, $2);
>> $pre =~ s/(signed\s+)?char/Sint16/g;
>> $pre =~ s/unSint16/unsigned char/g;
>> "$pre$str"
>> }ge;
> jeg kan næste regne virke måden ud men s{}, er det det samme som s///?
> og hvorfor har du et ? i ".*?" (først linje)

Ja. s{foo}{bar} er det samme som s/foo/bar/. Til quote-like operatorer
kan man bruge næsten alle tegn til at adskille de enkelte dele og hvis
man bruger parentesligende tegn '(', '{', '<' og '[' skal de afsluttes
at den tilsvarende højre-parentes. Læs perlop(1) begyndelsen af
afsnitte om quote-operatoren og andre quote-ligende operatorer.

Spørgsmålstegnet i /".*?"/ betyder at stjernen skal matche så lidt som
overhovedet muligt. Hvis den ikke stod der ville .* matche alt frem
til den sidste dobbelt-pling men nu matcher den kun til den første
dobbelt-pling.

Du kan læse om grådige og ikke grådig regulære udtryk i perlre(1) i
afsnittet 'Regular Expressions' i 7. paregraf (alt efter hvordan man
tæller. Jeg har sikkert ikke talt helt konsekvent ned gennem teksten)

> og når der bare står
> "$pre$str"
> er det så det samme som
> $_="$pre$str"

Bemærk e'et tilsidst. De betyder at udtrykket inde i blokken bliver
evalueret og resultatet bliver indsat istedet for det matchede. Og
resultatet af en kode-blok er bare resultatet af det sidste udtryk i
blokken, her bare en streng der ekspanderes.

--
Peter Makholm | According to the hacker ethic, the meaning of life
peter@makholm.net | is not Friday, but it is not Sunday either
http://hacking.dk | -- Peeka Himanen

T. Sandbaek (14-03-2003)
Kommentar
Fra : T. Sandbaek


Dato : 14-03-03 10:20

Ok, så blev jeg lidt kloger

Tak for den hurtige hjælp,
og så må jeg vist til at øve mig lidt mere på Perl.

med venlig hilsen
Torben


"Peter Makholm" <peter@makholm.net> wrote in message
news:87d6ku5nit.fsf@xyzzy.adsl.dk...
> "T. Sandbaek" <tpn@NO-SPAM-PLEASEcontrol-systems.com> writes:
>
> >> s{([^"]*)(".*?")?}{
> >> my ($pre, $str) = ($1, $2);
> >> $pre =~ s/(signed\s+)?char/Sint16/g;
> >> $pre =~ s/unSint16/unsigned char/g;
> >> "$pre$str"
> >> }ge;
> > jeg kan næste regne virke måden ud men s{}, er det det samme som s///?
> > og hvorfor har du et ? i ".*?" (først linje)
>
> Ja. s{foo}{bar} er det samme som s/foo/bar/. Til quote-like operatorer
> kan man bruge næsten alle tegn til at adskille de enkelte dele og hvis
> man bruger parentesligende tegn '(', '{', '<' og '[' skal de afsluttes
> at den tilsvarende højre-parentes. Læs perlop(1) begyndelsen af
> afsnitte om quote-operatoren og andre quote-ligende operatorer.
>
> Spørgsmålstegnet i /".*?"/ betyder at stjernen skal matche så lidt som
> overhovedet muligt. Hvis den ikke stod der ville .* matche alt frem
> til den sidste dobbelt-pling men nu matcher den kun til den første
> dobbelt-pling.
>
> Du kan læse om grådige og ikke grådig regulære udtryk i perlre(1) i
> afsnittet 'Regular Expressions' i 7. paregraf (alt efter hvordan man
> tæller. Jeg har sikkert ikke talt helt konsekvent ned gennem teksten)
>
> > og når der bare står
> > "$pre$str"
> > er det så det samme som
> > $_="$pre$str"
>
> Bemærk e'et tilsidst. De betyder at udtrykket inde i blokken bliver
> evalueret og resultatet bliver indsat istedet for det matchede. Og
> resultatet af en kode-blok er bare resultatet af det sidste udtryk i
> blokken, her bare en streng der ekspanderes.
>
> --
> Peter Makholm | According to the hacker ethic, the meaning of life
> peter@makholm.net | is not Friday, but it is not Sunday either
> http://hacking.dk | -- Peeka Himanen



Flemming Frandsen (14-03-2003)
Kommentar
Fra : Flemming Frandsen


Dato : 14-03-03 12:00

T. Sandbaek wrote:
>>Ja. s{foo}{bar} er det samme som s/foo/bar/. Til quote-like operatorer
>>kan man bruge næsten alle tegn
> Ok, så blev jeg lidt kloger

Det kan i den sammenhæng tilføjes at "" og '' også kan udskiftes, så man
ikke skal skrive \" eller \' i strengen (noget man er *meget* glad for
hvis man laver strenge med plinger i):

q(streng med 'er i) eq 'streng med \'er i';
qq|<a href="http://ale.dk">Don't drink $carlsberg</a>|

Dette er de normale quotes med deres default quote chars (som du bare
kan skifte ud):

q'' Ikke interpolerende streng
qq"" Interpolerende streng
m// Regexp match
s/// Regexp substitute


Det kan faktisk være ret svært at finde en quote char som ikke er i det
data man har med at gøre hvis man laver en kodegenerator, men så skal
man bare huske alle de skumle tegn som man aldrig bruger, som f.eks.:
§ ¾ ½ ¤

Personligt er mit favorit-"skummelt quote tegn" §, hvad bruger andre?
(ja det er borderline offtopic, men det er fredag og godt vejr).

--
Regards Flemming Frandsen - http://dion.swamp.dk
PartyTicket.Net co founder & Yet Another Perl Hacker


Peter Makholm (14-03-2003)
Kommentar
Fra : Peter Makholm


Dato : 14-03-03 12:28

Flemming Frandsen <ff-news.tiscali.dk@partyticket.net> writes:

> Det kan i den sammenhæng tilføjes at "" og '' også kan udskiftes, så
> man ikke skal skrive \" eller \' i strengen (noget man er *meget* glad
> for hvis man laver strenge med plinger i):

Jeg laver ret tit regulære udtryk på filnavne. Der er det dejligt at
kunne skrive s|/home/([^/]+)|/usr/local/home/$1| agtige ting. Det er
der jeg har mest brug for at bruge andre tegn.

> Personligt er mit favorit-"skummelt quote tegn" §, hvad bruger andre?
> (ja det er borderline offtopic, men det er fredag og godt vejr).

Det kommer lidt an på hvad det skal bruges til.

Et af mine absolut yndlingsudtryk er:

1&($.|y|||c|y|a|||y|e|||y|i|||y|o|||y|u|||y|y||)||print

Der på genial vis bruger |'er. Ellers kan det også være guld at bruge
et bogstav.

--
Peter Makholm | I laugh in the face of danger. Then I hide until
peter@makholm.net | it goes away
http://hacking.dk | -- Xander

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste