test na cislo
Jiri Polcar
polcar na physics.muni.cz
Čtvrtek Říjen 24 14:05:39 MEST 2002
On Thu, Oct 24, 2002 at 01:39:44PM +0200, Honza Pazdziora wrote:
> On Thu, Oct 24, 2002 at 01:34:36PM +0200, Jiri Polcar wrote:
> > Potrebuju prevest uhel z notace
> >
> > deg:min:sec (23:23:322.432)
> >
> > na dekadickou
> >
> > deg (23.3895)
> >
> > Od uzivatele prevezmu `deg:min:sec', splitnu to
> >
> > ( $deg, $min, $sec ) = split /:/, $input;
> >
> > a chci se podivat, jestli maji jednotlive casti ($deg, $min a $sec)
> > smysl, napriklad, jestli
> >
> > 0 <= $min < 60
> >
> > Pokud v $min neni cislo, tak predchozi podminka zkonci s warningem. Tomu
> > se snazim vyhnout. Je to srozumintelne?
>
> No dobre, ale porad jste nerekl, co se ma stat. Pokud nezadanou (nebo
> divne zadanou hodnotu) chcete povazovat za nulu, tak si proste do te
> casti kodu, kde tohle testujete, dejte
>
> local $^W = 0;
> $min += 0;
Pokud udelam,
$min = '3231g42';
{
local $^W = 0;
$min += 0;
}
bude v $min `3231'. To ovsem meni to, co uzivatel zada. Ten zadal
nesmysl a ja chci, aby se o tom dozvedel (ne z warningu Perlu) a program
zkonci.
>
> Pokud chcete detekovat, ze tam je rozumna hodnota, udelejte si naopak
> test na
>
> $min =~ /^[0-5]?[0-9]$/
>
No, v podstate to cislo nemusi byt pouze v tomto tvaru. Kdyz uzivatel
bude chtit, at je treba v exponencialnim tvaru. Podstatne je pouze to,
jestli lezi v intervalu
0 <= $min < 60
Uz jsem se s timto probleme setkal vicekrat a nakonec jsem to vzdy resil
regularnim vyrazem. Jenze tam snadno udelam chybu, tak jsem se tomu
chtel vyhnout.
Napadlo me toto:
$min = '5fds435';
{
$SIG{__WARN__} = sub { die "ERROR" };
eval { $min += 0 };
}
unless ( $@ ) { print "Cislo\n" } else { print "Necislo\n" }
Jenze to se me zda priliz komplikovany. Navic, kdyz Perl vraci warningy
typu:
Argument "5fds435" isn't numeric in addition (+) at ./t26.pl line...
vi, ze to cislo neni. Myslel jsem, ze existuje nejaky primocary postup,
jak takovou vec zjistit.
--
JP
Další informace o konferenci Perl