/ 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
Nulstilling af $1
Fra : YJ


Dato : 16-07-06 23:01

Hvorfor bliver $1 ikke nulstillet mellem de to kald? [1]

YJ




#!/usr/bin/perl

use strict;
use warnings;

my $data = "foo";

$data =~ /^(foo)$/;

print '$1: -->'. $1 ."<--\n";

$data =~ /^(bar)$/;

print '$1: -->'. $1 ."<--\n";





 
 
Michael Zedeler (17-07-2006)
Kommentar
Fra : Michael Zedeler


Dato : 17-07-06 08:12

YJ wrote:
> Hvorfor bliver $1 ikke nulstillet mellem de to kald? [1]

Se perlre:


The numbered variables ($1, $2, $3, etc.) and the related
punctuation set ($+, $&, $`, and $') are all dynamically
scoped until the end of the enclosing block or until the
next successful match, whichever comes first. (See "Com­
pound Statements" in perlsyn.)

Mvh. Michael.

--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Peter Makholm (17-07-2006)
Kommentar
Fra : Peter Makholm


Dato : 17-07-06 08:14

"YJ" <sdf@dsf.sdf> writes:

> Hvorfor bliver $1 ikke nulstillet mellem de to kald? [1]

Fordi det andet regulære udtryk ikke matcher. Det står i
perlre-manualsiden:

NOTE: failed matches in Perl do not reset the match variables,
which makes it easier to write code that tests for a series of
more specific cases and remembers the best match.

--
http://peter.makholm.net/ | Der er kun sorte tangenter tilbage på mit
peter@makholm.net | bluesklaver;
| Det Glade Pizzabud smiler ikke mer'
| -- Rasmus Nøhr, Ring nu

YJ (17-07-2006)
Kommentar
Fra : YJ


Dato : 17-07-06 08:54


"Peter Makholm" <peter@makholm.net> wrote in message
news:877j2c900o.fsf@xyzzy.adsl.dk...
> "YJ" <sdf@dsf.sdf> writes:
>
> > Hvorfor bliver $1 ikke nulstillet mellem de to kald? [1]
>
> Fordi det andet regulære udtryk ikke matcher. Det står i
> perlre-manualsiden:
>
> NOTE: failed matches in Perl do not reset the match variables,
> which makes it easier to write code that tests for a series of
> more specific cases and remembers the best match.


regexp 1
if defined $1 then proceed else return false

regexp 2
if defined $1 then proceed else return false

regexp 3
if defined $1 then proceed else return false


Hvis 1'eren matcher kommer man jo hele vejen igennem. Hvordan undgår jeg det
i ovenstående struktur?

Tak for svaret til begge.

YJ



Peter Brodersen (17-07-2006)
Kommentar
Fra : Peter Brodersen


Dato : 17-07-06 09:13

On Mon, 17 Jul 2006 09:54:23 +0200, "YJ" <sdf@dsf.sdf> wrote:

>Hvis 1'eren matcher kommer man jo hele vejen igennem. Hvordan undgår jeg det
>i ovenstående struktur?

Hvis forudsætningen er, at det regulære udtryk i det hele taget skal
matche, så kan du blot lave en if med dit regulære udtryk som
omstændighed for om koden i øvrigt skal afvikles:

if ($data =~ /^(foo)$/) {
   print '$1: -->'. $1 ."<--\n";
}
if ($data =~ /^(bar)$/) {
   print '$1: -->'. $1 ."<--\n";
}


Alternativt blot:
print '$1: -->'. $1 ."<--\n" if $data =~ /^(foo)$/;
print '$1: -->'. $1 ."<--\n" if $data =~ /^(bar)$/;

--
- Peter Brodersen
Ugens^WMånedens^WSommerens værktøj - Find vej: www.findvej.dk
Nu med valgfri tekst: www.findvej.dk/Nybrogade2,1203?text=Kulturministeriet

YJ (17-07-2006)
Kommentar
Fra : YJ


Dato : 17-07-06 09:44


"Peter Brodersen" <usenet2006@ter.dk> wrote in message
news:e9fgrb$2s3$1@news.klen.dk...
> On Mon, 17 Jul 2006 09:54:23 +0200, "YJ" <sdf@dsf.sdf> wrote:
>
> >Hvis 1'eren matcher kommer man jo hele vejen igennem. Hvordan undgår jeg
det
> >i ovenstående struktur?
>
> Hvis forudsætningen er, at det regulære udtryk i det hele taget skal
> matche, så kan du blot lave en if med dit regulære udtryk som
> omstændighed for om koden i øvrigt skal afvikles:
>
> if ($data =~ /^(foo)$/) {
> print '$1: -->'. $1 ."<--\n";
> }
> if ($data =~ /^(bar)$/) {
> print '$1: -->'. $1 ."<--\n";
> }


Hmm ja god ide.

Så kan jeg hurtigt lave en:

return 0 unless ($data =~ /^(foo)$/);
return 0 unless ($data =~ /^(bar)$/);
do_stuff ();

....og stadig være sikker på at do_stuff() kun afvikles, hvis alle udtryk
evaluerede til sandt.

Mange tak for hjælpen!

YJ



Michael Zedeler (17-07-2006)
Kommentar
Fra : Michael Zedeler


Dato : 17-07-06 10:32

YJ wrote:
> Så kan jeg hurtigt lave en:
>
> return 0 unless ($data =~ /^(foo)$/);
> return 0 unless ($data =~ /^(bar)$/);
> do_stuff ();

Eller bare

return 0 unless $data =~ /^(foo|bar)$/;
do_stuff();

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Peter Makholm (17-07-2006)
Kommentar
Fra : Peter Makholm


Dato : 17-07-06 09:04

"YJ" <sdf@dsf.sdf> writes:

>> Fordi det andet regulære udtryk ikke matcher. Det står i
>> perlre-manualsiden:
>>
>> NOTE: failed matches in Perl do not reset the match variables,
>> which makes it easier to write code that tests for a series of
>> more specific cases and remembers the best match.
>
>
> regexp 1
> if defined $1 then proceed else return false
>
> regexp 2
> if defined $1 then proceed else return false
>
> regexp 3
> if defined $1 then proceed else return false

Jeg tror at pointen er at man gør noget ala:

/(...)/;
/(f..)\d\d/;
/(foo2)/;

print $1;

Men jeg ville nok foretrække noget short circuit:

if (/(foo2)/ || /(f..)\d\d/ || /(...)/) {
do($1);
} else {
return false;
}

--
http://peter.makholm.net/ | Have you ever felt trapped inside a Klein
peter@makholm.net | bottle?
|

Henrik Schmidt (18-07-2006)
Kommentar
Fra : Henrik Schmidt


Dato : 18-07-06 20:11

YJ wrote:
> Hvorfor bliver $1 ikke nulstillet mellem de to kald? [1]
>
> YJ
>
>
>
>
> #!/usr/bin/perl
>
> use strict;
> use warnings;
>
> my $data = "foo";
>
> $data =~ /^(foo)$/;
>
> print '$1: -->'. $1 ."<--\n";
>
> $data =~ /^(bar)$/;
>
> print '$1: -->'. $1 ."<--\n";
>
>
>
>

Fordi sådan er det i Perl. Det er en af de gotchas, som jeg har bandet
højt og længe over, da jeg skulle lære sproget, da jeg ikke var
opmærksom på det fra starten af. Det giver nogle ret sjove fejl. :(

Jeg plejer at gøre følgende:

$foo = $1 if $data =~ /^(foo)$/;
if ($foo) {
....
}

Bemærk, at man i Ruby har lavet dette om, så $n bliver sat efter hvert
pattern match, uanset om pattern'et matcher eller ej.

Mvh,
Henrik Schmidt


Michael Zedeler (18-07-2006)
Kommentar
Fra : Michael Zedeler


Dato : 18-07-06 23:21

Henrik Schmidt wrote:

> $foo = $1 if $data =~ /^(foo)$/;
> if ($foo) {
> ...
> }

Normalt skriver man altså bare

if($data =~ /^(foo)$/) {
   ...gør noget ved $1...
}

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Peter Makholm (18-07-2006)
Kommentar
Fra : Peter Makholm


Dato : 18-07-06 20:48

Henrik Schmidt <nospam@a.b.c.d> writes:

> Jeg plejer at gøre følgende:
>
> $foo = $1 if $data =~ /^(foo)$/;
> if ($foo) {
> ...
> }

Hvorfor ikke bare

if (/^(foo)/) {
do($1);
}

med din metode vil du få problemer med noget ala:

$foo = $1 if /(\d)/;
if ($foo) {
...
}

hvis tallet er 0.

Man bør altid teste på om ens regexp matcher. Det er det man er
interesseret i først.

--
http://peter.makholm.net/ | Emacs is the only modern general-purpose
peter@makholm.net | operating system that doesn't multitask
|

Peter Makholm (20-07-2006)
Kommentar
Fra : Peter Makholm


Dato : 20-07-06 12:21

Henrik Schmidt <nospam@a.b.c.d> writes:

> Nu var det ikke for at starte en religionskrig, og jeg er faktisk enig
> i, at din løsning er at foretrække. Jeg kender ikke andre sprog, hvor
> "0" (samt "", 0.0 og undef) evalueres til false, men jeg er da ikke i
> tvivl om, at de findes. Jeg er ikke ligefrem nogen sproghaj.

Det er en følge af at sproget ikke skelner mellem strengen "0" og
tallet 0. Ellers er det stort set helt svarende til reglerne i C. PHP
opfører sig helt som perl.

--
http://peter.makholm.net/ | Ladies and gentlemen, take my advice, pull
peter@makholm.net | down your pants and slide on the ice
| -- Sidney Freedman

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

Månedens bedste
Årets bedste
Sidste års bedste