osmickove

Honza Pazdziora adelton na informatics.muni.cz
Úterý Duben 16 14:14:20 MEST 2002


On Tue, Apr 16, 2002 at 01:46:17PM +0200, Jiri Polcar wrote:
> Uz pred poslanim dotazu do konference jsem to vyresil filtrovanim pres
> regularni vyraz:
> 
>     s/([^123456789])0+([123456789])/$1$2/g;
> 
> Jinak nacitam data (cas) ve formatu
> 
>     HHH:MM:SS 
> 
> a prepocitavam na minuty:
> 
>   ( $h, $m, $s) = split( /:/, $time );
>   $min = $h*60+$m+$s/60;
> 
> Ve skutecnosti je vstup o neco komplikovanejsi. Kolem casu jsou nejaky
> stredniky, carky a podobne...
> 
> Trvalo me docela dlouho, nez jsem odhalil naprosto zahadne chovani, kdyz
> v se v promennych $m a $s vyskytovalo neco jako "05" a podobne.

$ perl
$x = '011';
$y = '013';
print $x + $y, "\n";
__END__
24

Mate chybu nekde jinde. U hodnot v retezcich se pri prevodu na
numerickou hodnotu nuly zleva orezavaji a neberou se do uvahy. To
byste musel pouzit explicitne funkci oct.

$ perl
$x = '011';
$y = '013';
print oct($x) + oct($y), "\n";
__END__
20

Nula na zacatku cisla se bere jako znak oktalove hodnoty implicitne
_pouze_, pokud je to pri literalnim zapisu v kodu skriptu. Nikoli
v promennych.

$ perl
print 011 + 013, "\n";
__END__
20

-- 
------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
      ... all of these signs saying sorry but we're closed ...
------------------------------------------------------------------------


Další informace o konferenci Perl