|
| chop, og? Fra : Dieter Britz |
Dato : 14-02-08 11:14 |
|
Jeg vil gerne fjerne paranteserne omkring et årstal, fx skal "(1969)"
blive til blot "1969".
chop $year
giver mig "(1969", OK. Men hvordan kommer jeg af med det første "("?
Jeg kan ikke finde det i min Perl bog. Jeg har prøvet med reverse, chop,
og reverse igen, men det går ikke (hvorfor egentligt ikke?).
--
Dieter Britz (britz<at>chem.au.dk)
| |
Dieter Britz (14-02-2008)
| Kommentar Fra : Dieter Britz |
Dato : 14-02-08 11:20 |
|
Dieter Britz wrote:
> Jeg vil gerne fjerne paranteserne omkring et årstal, fx skal "(1969)"
> blive til blot "1969".
> chop $year
> giver mig "(1969", OK. Men hvordan kommer jeg af med det første "("?
> Jeg kan ikke finde det i min Perl bog. Jeg har prøvet med reverse, chop,
> og reverse igen, men det går ikke (hvorfor egentligt ikke?).
OK, det andet spørgsmål har jeg fundet ud af. Det her virker:
chop ($year); $raey = reverse ($year);
chop ($raey); $year = reverse ($raey);
Men jeg mener, der må være noget, der hugger det første tegn af.
--
Dieter Britz (britz<at>chem.au.dk)
| |
Peter Makholm (14-02-2008)
| Kommentar Fra : Peter Makholm |
Dato : 14-02-08 11:26 |
|
Dieter Britz <britz@chem.au.dk> writes:
> Jeg vil gerne fjerne paranteserne omkring et årstal, fx skal "(1969)"
> blive til blot "1969".
> chop $year
Glem at chop eksisterer.
> giver mig "(1969", OK. Men hvordan kommer jeg af med det første "("?
> Jeg kan ikke finde det i min Perl bog. Jeg har prøvet med reverse, chop,
> og reverse igen, men det går ikke (hvorfor egentligt ikke?).
Det du vil er at finde en delstreng, ikke?
Det findes der en funktion der kan direkte:
$year = substr($year, 1, 4);
//Makholm
| |
Dieter Britz (14-02-2008)
| Kommentar Fra : Dieter Britz |
Dato : 14-02-08 11:28 |
|
Peter Makholm wrote:
> Dieter Britz <britz@chem.au.dk> writes:
>
>> Jeg vil gerne fjerne paranteserne omkring et årstal, fx skal "(1969)"
>> blive til blot "1969".
>> chop $year
>
> Glem at chop eksisterer.
>
>> giver mig "(1969", OK. Men hvordan kommer jeg af med det første "("?
>> Jeg kan ikke finde det i min Perl bog. Jeg har prøvet med reverse, chop,
>> og reverse igen, men det går ikke (hvorfor egentligt ikke?).
>
> Det du vil er at finde en delstreng, ikke?
>
> Det findes der en funktion der kan direkte:
>
> $year = substr($year, 1, 4);
>
> //Makholm
Mange tak! Perfekt.
--
Dieter Britz (britz<at>chem.au.dk)
| |
Steen Suder (15-02-2008)
| Kommentar Fra : Steen Suder |
Dato : 15-02-08 19:19 |
|
Peter Makholm wrote:
> Dieter Britz <britz@chem.au.dk> writes:
>
>> Jeg vil gerne fjerne paranteserne omkring et årstal, fx skal "(1969)"
>> blive til blot "1969".
>> chop $year
>
> Glem at chop eksisterer.
>
>> giver mig "(1969", OK. Men hvordan kommer jeg af med det første "("?
>> Jeg kan ikke finde det i min Perl bog. Jeg har prøvet med reverse, chop,
>> og reverse igen, men det går ikke (hvorfor egentligt ikke?).
>
> Det du vil er at finde en delstreng, ikke?
>
> Det findes der en funktion der kan direkte:
>
> $year = substr($year, 1, 4);
Peter, det går altså ikke; år titusind-problemet bør tages seriøst.
--
Steen Suder
Prøv at forestille dig, at du er en anden, og læs så din artikel igennem
inden du sender den. Alle har interesse i, at du staver og formulerer
dig, så godt du kan. På den måde forstås det lettere, hvad du skriver.
| |
Michael Zedeler (14-02-2008)
| Kommentar Fra : Michael Zedeler |
Dato : 14-02-08 20:11 |
|
Hej Dieter.
Dieter Britz wrote:
> Jeg vil gerne fjerne paranteserne omkring et årstal, fx skal "(1969)"
> blive til blot "1969".
> chop $year
> giver mig "(1969", OK. Men hvordan kommer jeg af med det første "("?
> Jeg kan ikke finde det i min Perl bog. Jeg har prøvet med reverse, chop,
> og reverse igen, men det går ikke (hvorfor egentligt ikke?).
Det kan man også løse med regulære udtryk. Hvis du f. eks. blot vil have
tallet ud og iøvrigt fjerne alle ikke-tal omkring, brug:
my ($year) = $input =~ /(\d+)/;
Det vil give disse resultater:
(1969) -> 1969
(42342343243) -> 42342343243
abcd123def -> 123
a1b2c3 -> 1
Man kan også lave det sådan at det kun virker på tal i paranteser.
Mvh. Michael.
| |
Peter Makholm (15-02-2008)
| Kommentar Fra : Peter Makholm |
Dato : 15-02-08 06:58 |
|
Michael Zedeler <michael@zedeler.dk> writes:
> Det kan man også løse med regulære udtryk. Hvis du f. eks. blot vil have
> tallet ud og iøvrigt fjerne alle ikke-tal omkring, brug:
>
> my ($year) = $input =~ /(\d+)/;
En løsning der er mindre præcis, mere kompliceret og formodentlig
langsommere. Hvorfor skulle man dog ville det?
//Makholm
| |
Michael Zedeler (15-02-2008)
| Kommentar Fra : Michael Zedeler |
Dato : 15-02-08 22:51 |
|
Peter Makholm wrote:
> Michael Zedeler <michael@zedeler.dk> writes:
>
>> Det kan man også løse med regulære udtryk. Hvis du f. eks. blot vil have
>> tallet ud og iøvrigt fjerne alle ikke-tal omkring, brug:
>>
>> my ($year) = $input =~ /(\d+)/;
>
> En løsning der er mindre præcis, mere kompliceret og formodentlig
> langsommere. Hvorfor skulle man dog ville det?
Jamen din substr-løsning er da meget fin, Peter. (Pånær det med år
10000-problemet
Når en person spørger som Dieter gjorde, er det fordi han tydeligvis
slet ikke har opdaget hvordan regulære udtryk i perl virker endnu,
hvilket er den stærkeste feature i sproget. Jeg gav et eksempel for at
illustrere hvad man kan og i særdeleshed hvordan det ville opføre sig i
nogle randtilfælde hvor det ville adskille sig fra substr-løsningen.
Jeg kunne godt tænke mig et eksempel på et problem i den virkelige
verden, hvor du har sparet signifikant køretid på at udskifte et
regulært udtryk af tilsvarende kompleksitet med en substr-konstruktion i
perl.
Mvh. Michael.
| |
Peter Makholm (16-02-2008)
| Kommentar Fra : Peter Makholm |
Dato : 16-02-08 08:12 |
|
Michael Zedeler <michael@zedeler.dk> writes:
> Når en person spørger som Dieter gjorde, er det fordi han tydeligvis
> slet ikke har opdaget hvordan regulære udtryk i perl virker endnu,
> hvilket er den stærkeste feature i sproget.
I hvert fald den feature der stærkest kan lede folk i
uføre. Reflekstanken "Hvordan løser jeg dette med et regulært udtryk?"
er nok noget af det der leder til mest uvedligeholdbart kode i
perlverden.
//Makholm
| |
Ukendt (16-02-2008)
| Kommentar Fra : Ukendt |
Dato : 16-02-08 08:54 |
|
Peter Makholm skrev den 16-02-2008 08:11:
> I hvert fald den feature der stærkest kan lede folk i
> uføre. Reflekstanken "Hvordan løser jeg dette med et regulært udtryk?"
> er nok noget af det der leder til mest uvedligeholdbart kode i
> perlverden.
For at kode KAN vedligeholdes SKAL man skrive det så det kan
vedligeholdes. For regulære udtryk kræver det ofte noget
efterbehandling for at gøre det læseligt, som man let fristes til at
springe over.
Det er i min erfaring tegn på modenhed af både udvikler og projekt at
lave kode der kan overleve både projekt og udvikler :)
--
Thorbjørn Ravn Andersen "... plus... Tubular Bells!"
| |
Michael Zedeler (16-02-2008)
| Kommentar Fra : Michael Zedeler |
Dato : 16-02-08 16:07 |
|
Peter Makholm wrote:
> Michael Zedeler <michael@zedeler.dk> writes:
>
>> Når en person spørger som Dieter gjorde, er det fordi han tydeligvis
>> slet ikke har opdaget hvordan regulære udtryk i perl virker endnu,
>> hvilket er den stærkeste feature i sproget.
>
> I hvert fald den feature der stærkest kan lede folk i
> uføre. Reflekstanken "Hvordan løser jeg dette med et regulært udtryk?"
> er nok noget af det der leder til mest uvedligeholdbart kode i
> perlverden.
De stærkeste værktøjer er også dem man kan bruge til de dummeste ting.
Det er der da ikke noget nyt i. Uanset hvilke værktøjer man har til
rådighed, skal man nok bruge dem på noget dumt hvis man er en dårlig
programmør.
Et er om man opfatter regulære udtryk som læsevenlige, eller ej, men det
er først virkelig problematisk hvis man bliver tvunget til at skrive
dele af koden om. Jeg har set en håndfuld eksempler på uhensigtsmæssig
anvendelse af regulære udtryk, men der har da været langt imellem dem.
Mvh. Michael.
| |
Dieter Britz (18-02-2008)
| Kommentar Fra : Dieter Britz |
Dato : 18-02-08 09:40 |
|
Michael Zedeler wrote:
> Hej Dieter.
>
> Dieter Britz wrote:
>> Jeg vil gerne fjerne paranteserne omkring et årstal, fx skal "(1969)"
>> blive til blot "1969".
>> chop $year
>> giver mig "(1969", OK. Men hvordan kommer jeg af med det første "("?
>> Jeg kan ikke finde det i min Perl bog. Jeg har prøvet med reverse, chop,
>> og reverse igen, men det går ikke (hvorfor egentligt ikke?).
>
> Det kan man også løse med regulære udtryk. Hvis du f. eks. blot vil have
> tallet ud og iøvrigt fjerne alle ikke-tal omkring, brug:
>
> my ($year) = $input =~ /(\d+)/;
>
> Det vil give disse resultater:
>
> (1969) -> 1969
> (42342343243) -> 42342343243
> abcd123def -> 123
> a1b2c3 -> 1
>
> Man kan også lave det sådan at det kun virker på tal i paranteser.
>
> Mvh. Michael.
Tak, og det har løst problemet. Men, jeg må indrømme, at jeg ikke
forstår hvorfor. Jeg har prøvet at finde forklaringen i min Perl
bog, "Learning Perl", men forgæves. Gider du forklare det? Altså,
hvorfor $input =~ /(\d+)/ producerer de fire ciffre, og ikke
parenteserne med?
--
Dieter Britz (britz<at>chem.au.dk)
| |
Ukendt (18-02-2008)
| Kommentar Fra : Ukendt |
Dato : 18-02-08 10:52 |
|
Dieter Britz skrev den 18-02-2008 09:39:
> Tak, og det har løst problemet. Men, jeg må indrømme, at jeg ikke
> forstår hvorfor. Jeg har prøvet at finde forklaringen i min Perl
> bog, "Learning Perl", men forgæves. Gider du forklare det? Altså,
> hvorfor $input =~ /(\d+)/ producerer de fire ciffre, og ikke
> parenteserne med?
Den slags paranteser betyder "opsaml resultat". Så ovenstående matcher
bare så mange cifre som muligt, og opsamler resultatet. \( og \)
matcher udtrykkeligt hhv venstre og højre parantes.
--
Thorbjørn Ravn Andersen "... plus... Tubular Bells!"
| |
Dieter Britz (18-02-2008)
| Kommentar Fra : Dieter Britz |
Dato : 18-02-08 13:31 |
|
Thorbjørn Ravn Andersen wrote:
> Dieter Britz skrev den 18-02-2008 09:39:
>> Tak, og det har løst problemet. Men, jeg må indrømme, at jeg ikke
>> forstår hvorfor. Jeg har prøvet at finde forklaringen i min Perl
>> bog, "Learning Perl", men forgæves. Gider du forklare det? Altså,
>> hvorfor $input =~ /(\d+)/ producerer de fire ciffre, og ikke
>> parenteserne med?
>
> Den slags paranteser betyder "opsaml resultat". Så ovenstående matcher
> bare så mange cifre som muligt, og opsamler resultatet. \( og \)
> matcher udtrykkeligt hhv venstre og højre parantes.
>
Tak for det, nu er det klart. Det er også klart, at jeg skal sikre
mig (i programmet) at cifrene faktisk er omgivet af parenteser.
--
Dieter Britz (britz<at>chem.au.dk)
| |
Adam Sjøgren (18-02-2008)
| Kommentar Fra : Adam Sjøgren |
Dato : 18-02-08 17:32 |
|
On Mon, 18 Feb 2008 13:30:50 +0100, Dieter wrote:
> Thorbjørn Ravn Andersen wrote:
>> Dieter Britz skrev den 18-02-2008 09:39:
>>> hvorfor $input =~ /(\d+)/ producerer de fire ciffre, og ikke
[...]
> Tak for det, nu er det klart. Det er også klart, at jeg skal sikre
> mig (i programmet) at cifrene faktisk er omgivet af parenteser.
Nøh, bare noget andet end cifre:
$ perl -ne '/(\d+)/; print "$1\n";'
F1722)hep
1722
$
(Det kan så være en fordel eller en ulempe alt efter
omstændighederne...)
Mvh.
--
"I'm a man of few words." "Maybe if you read more, Adam Sjøgren
you'd have a larger vocabulary." asjo@koldfront.dk
| |
Dieter Britz (22-02-2008)
| Kommentar Fra : Dieter Britz |
Dato : 22-02-08 11:12 |
|
Adam Sjøgren wrote:
> On Mon, 18 Feb 2008 13:30:50 +0100, Dieter wrote:
>
>> Thorbjørn Ravn Andersen wrote:
>>> Dieter Britz skrev den 18-02-2008 09:39:
>
>>>> hvorfor $input =~ /(\d+)/ producerer de fire ciffre, og ikke
>
> [...]
>
>> Tak for det, nu er det klart. Det er også klart, at jeg skal sikre
>> mig (i programmet) at cifrene faktisk er omgivet af parenteser.
>
> Nøh, bare noget andet end cifre:
>
> $ perl -ne '/(\d+)/; print "$1\n";'
> F1722)hep
> 1722
> $
>
> (Det kan så være en fordel eller en ulempe alt efter
> omstændighederne...)
Ja, en ulempe her. Jeg har nu fundet beskrivelsen af brug af
parenteser i lærebogen "Learning Perl", og forstår det. Det jeg
ikke kunne finde er, hvordan jeg angiver parenteser der selv skal
matches. Jeg vil gerne sikre, at de fire cifre ER omgivet af
parenteser, inden jeg ekstraherer dem, for ikke at ekstrahere en
gruppe af fire cifre, som ikke er et årstal. Altså, hvordan matcher
jeg med "(" eller ")", uden at de bliver opfattet som indramning af
noget der skal i $1?
--
Dieter Britz (britz<at>chem.au.dk)
| |
Henrik Christian Gro~ (22-02-2008)
| Kommentar Fra : Henrik Christian Gro~ |
Dato : 22-02-08 11:43 |
|
Dieter Britz <britz@chem.au.dk> writes:
> Adam Sjøgren wrote:
>
>> On Mon, 18 Feb 2008 13:30:50 +0100, Dieter wrote:
>>
>>> Thorbjørn Ravn Andersen wrote:
>>>> Dieter Britz skrev den 18-02-2008 09:39:
>>
>>>>> hvorfor $input =~ /(\d+)/ producerer de fire ciffre, og ikke
>>
>> [...]
>>
>>> Tak for det, nu er det klart. Det er også klart, at jeg skal sikre
>>> mig (i programmet) at cifrene faktisk er omgivet af parenteser.
>>
>> Nøh, bare noget andet end cifre:
>>
>> $ perl -ne '/(\d+)/; print "$1\n";'
>> F1722)hep
>> 1722
>> $
>>
>> (Det kan så være en fordel eller en ulempe alt efter
>> omstændighederne...)
>
> Ja, en ulempe her. Jeg har nu fundet beskrivelsen af brug af
> parenteser i lærebogen "Learning Perl", og forstår det. Det jeg
> ikke kunne finde er, hvordan jeg angiver parenteser der selv skal
> matches. Jeg vil gerne sikre, at de fire cifre ER omgivet af
> parenteser, inden jeg ekstraherer dem, for ikke at ekstrahere en
> gruppe af fire cifre, som ikke er et årstal. Altså, hvordan matcher
> jeg med "(" eller ")", uden at de bliver opfattet som indramning af
> noget der skal i $1?
/\((\d+)\)/
..Henrik
--
.... applications which need to address vast amounts of memory
(e.g., big scientific crankers, large databases, emacs) ...
-- fra en artikel i LWN
| |
Soren (News) (22-02-2008)
| Kommentar Fra : Soren (News) |
Dato : 22-02-08 11:57 |
|
Henrik Christian Grove <usenet@3001.dk> writes:
>> Ja, en ulempe her. Jeg har nu fundet beskrivelsen af brug af
>> parenteser i lærebogen "Learning Perl", og forstår det. Det jeg
>> ikke kunne finde er, hvordan jeg angiver parenteser der selv skal
>> matches. Jeg vil gerne sikre, at de fire cifre ER omgivet af
>> parenteser, inden jeg ekstraherer dem, for ikke at ekstrahere en
>> gruppe af fire cifre, som ikke er et årstal. Altså, hvordan matcher
>> jeg med "(" eller ")", uden at de bliver opfattet som indramning af
>> noget der skal i $1?
>
> /\((\d+)\)/
Og hvis det kun er aarstal med praecist 4 cifre du er interesseret i;
/\((\d{4})\)/
Mvh,
Soren
| |
Flemming Frandsen (22-02-2008)
| Kommentar Fra : Flemming Frandsen |
Dato : 22-02-08 12:42 |
|
Soren (News) wrote:
>> /\((\d+)\)/
>
> Og hvis det kun er aarstal med praecist 4 cifre du er interesseret i;
>
> /\((\d{4})\)/
Og hvis der absolut ikke må stå andet end årstallet med paranteser i
strengen så skal du bruge ^ og $ til at matche starten og slutningen af
strengen:
/^\((\d{4})\)$/
Det matcher "(1234)" men ikke "hest(1234)" eller "(1234)hest".
Datakvalitet er din ven, jeg har ofte brugt die til at sikre at man ikke
ved et uheld kommer til at overse et problem med data:
$s =~ /^\((\d{4})\)$/ or die "Kan ikke finde et år i: $s";
my $y = $1;
| |
Adam Sjøgren (25-02-2008)
| Kommentar Fra : Adam Sjøgren |
Dato : 25-02-08 22:31 |
|
On Fri, 22 Feb 2008 11:12:02 +0100, Dieter wrote:
> Det jeg ikke kunne finde er, hvordan jeg angiver parenteser der selv
> skal matches. Jeg vil gerne sikre, at de fire cifre ER omgivet af
> parenteser, inden jeg ekstraherer dem, for ikke at ekstrahere en
> gruppe af fire cifre, som ikke er et årstal. Altså, hvordan matcher
> jeg med "(" eller ")", uden at de bliver opfattet som indramning af
> noget der skal i $1?
Du kan enten escape' dem, som foreslået, med \(, som så betyder "tegnet
parantes-begynd", eller du kan bruge en tegnmængde a la [(].
Jeg synes ofte det sidste er mest læseligt - dit regulære udtryk bliver
så:
[(](\d{4})[)] vs. \((\d{4})\)
Ptjah, der er vist ikke den store æstetiske forskel her.
Mvh.
Adam
--
"Language design is being taken over by hackers. The Adam Sjøgren
results so far are messy, but encouraging." asjo@koldfront.dk
| |
Thorbjørn Ravn Ander~ (25-02-2008)
| Kommentar Fra : Thorbjørn Ravn Ander~ |
Dato : 25-02-08 22:54 |
|
Adam Sjøgren skrev den 25-02-2008 22:30:
> [(](\d{4})[)] vs. \((\d{4})\)
>
> Ptjah, der er vist ikke den store æstetiske forskel her.
Mindes svagt noget om en /x dims der skulle hjælpe. Nogen der har
praktisk erfaring?
--
Thorbjørn Ravn Andersen "... plus... Tubular Bells!"
| |
Michael Zedeler (25-02-2008)
| Kommentar Fra : Michael Zedeler |
Dato : 25-02-08 22:54 |
|
Thorbjørn Ravn Andersen wrote:
> Adam Sjøgren skrev den 25-02-2008 22:30:
>
>> [(](\d{4})[)] vs. \((\d{4})\)
>>
>> Ptjah, der er vist ikke den store æstetiske forskel her.
>
> Mindes svagt noget om en /x dims der skulle hjælpe. Nogen der har
> praktisk erfaring?
Jeps. Så kan man hælde whitespace ind efter behov. F. eks.:
/\( \d{4} \)/x.
Det flag har større virkning på mere omfattende udtryk.
Mvh. Michael.
| |
N/A (16-02-2008)
| Kommentar Fra : N/A |
Dato : 16-02-08 08:54 |
|
| |
N/A (25-02-2008)
| Kommentar Fra : N/A |
Dato : 25-02-08 22:54 |
|
| |
N/A (25-02-2008)
| Kommentar Fra : N/A |
Dato : 25-02-08 22:54 |
|
| |
|
|