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