> > Rad bi cel fajl preiskal, ce vsebuje doloceno besedo.
> > poizkusil sem takole:
> >
> > system("/usr/bin/touch uptimer");
> > system("/usr/bin/uptime >> uptimer");
> >
>> open (IN, "uptimer");
>> $fajl=<IN>;
>>
>> if ($fajl =~ m/average/g) {
>> print "dela\n\n";
>> } else {
>> print "ne dela\n\n";
>> }
>>
>> vendar brez uspeha. Datoteka uptimer vsebuje besedico "average",
>> vendar mi izpise "ne dela", ce ta besedica ni v prvi vrstici fajla.
>> Zakaj?
> Daj m-ju se opcijo m, ker drugace perl isce samo do prvega \n
Narobe. Obicajno iskanje cisto v redu dela, tudi ce ima spremenljivka
v sebi cel kup newline. Newline se enostavno obnasa kot se en non-printable
znak, kar pomeni, da ga ujame \s.
Edina zadeva, na katero m opcija vpliva, je, da se drugace obnasata
sidri ^ in $. Obicajno se ti sidri ujameta samo na zacetku in na koncu NIZA.
Ce je izbrana opcija m, potem se ti sidri ujameta na zacetku in koncu
VRSTICE znotraj niza.
Mimogrede, opcija s ne naredi drugega, kot da omogoci, da se . ujema
tudi z znakom za novo vrstico. Zato tudi ima vcasih smisel uporabiti
opciji m in s skupaj.
En primer, da bo zadeva bolj jasna:
#!/usr/bin/perl -w
sub yesno {
if ($_[0]) {
print "YES\n";
} else {
print "NO\n";
}
}
$foo="abc\ndef";
yesno($foo=~/abc/);
yesno($foo=~/bla/);
yesno($foo=~/def/);
yesno($foo=~/def/m);
yesno($foo=~/def/g);
yesno($foo=~/c\sd/);
yesno($foo=~/abc$/);
yesno($foo=~/abc$/m);
Ce ta program zazenemo, bo izpisal tole:
YES
NO
YES
YES
YES
YES
NO
YES
NO
Napaka v zgornjem programu torej ni to, da ni dal opcije, s katero bi iskali
cez vec kot eno vrstico (ker take opcije ni), ampak to, da ima v nizo
samo prvo vrstico iz datoteke, in ta, ocitno, ne vsebuje iskanega niza.
Lep pozdrav,
Matija
P.S. Upam, da ne zamerite, da sem kopijo tegale poslal tudi na
[EMAIL PROTECTED]