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



Søg
Reklame
Statistik
Spørgsmål : 177416
Tips : 31962
Nyheder : 719565
Indlæg : 6407862
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste