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