2010-09-03 7 views
20

Po prostu zwróciłem na to uwagę generowane przez Catalyst.pl. Jest to oczywiście jakiś niezapisany hack. Jaka jest zaleta tworzenia takiego łańcucha wersji? Nie mogę nawet dowiedzieć się, co próbują zrobić.Łańcuch wersji Perla: po co używać EVAL EXPR?

our $VERSION = '0.01'; 
$VERSION = eval $VERSION; 

Odpowiedz

25

Numery wersji są złożone w języku Perl. Here's an excellent overview dla osób szukających krwawych szczegółów. Może cię zaskoczyć, jak wiele subtelnych sposobów jest złego ...

Bezpośrednia odpowiedź na twoje pytanie jest taka, że ​​różne rzeczy oczekują różnych formatów. W przypadku CPAN, na przykład, zależy Ci na wersjach rozwojowych jako ciągu. W środowisku wykonawczym zależy ci na nich jako na liczbie.

Weź pod uwagę przypadek $VERSION = "0.01_001". eval poprawnie konwertuje go na numer 0.01001.

+1

Mój Boże, nie miałem pojęcia, że ​​wersje perla są tak okropne. +1 za świetny artykuł. –

+0

Dzięki za ten link, jest to jeden z lepszych postów na blogu Perla, które przeczytałem. To naprawdę wyjaśnia ten problem (ale wymaga aktualizacji w wariantach 'version.pm'). –

5

I można misremembering to, ale myślę, że niektóre zautomatyzowane analizatory składni kodu chciałbym zobaczyć linię kodu:

our $VERSION = '0.01'; 

Ale naprawdę chcesz $ WERSJA trzymać pływaka zamiast napisu.

Możesz przeczytać this article, Wiem, że mam zamiar.

Och, Boże, teraz pamiętam dlaczego używam

our $VERSION = 20100903; 

numery wersji styl. To po prostu szalone. Uwielbiam Perla, ale to czyste, wyrafinowane, skoncentrowane szaleństwo. Nie będę próbował podsumować artykułu Davida Goldena. Musisz tylko przeczytać i płakać.

+2

Numery wersji zajmują dla mnie 3 pierwsze miejsca, odpowiadając "Jakie są 5 rzeczy, których nienawidzisz w swoim ulubionym języku programowania?". – szbalint

+0

@szbalint: Wydaje się to raczej niezbyt dobrze przemyślaną piątką. –

6

Eval konwertuje ciąg "0.001_001" na liczbę, zgodnie z zasadami literałów numerycznych Perla (które umożliwiają podkreślenie czytelności). Wynikiem jest numer 0.001001.

Bez wartości eval łańcuch jest konwertowany na liczbę zgodną z regułą przekształcania ciągów znaków, która zatrzymuje się przy pierwszym znaku nienumerycznym.

Np perl -e 'print "0.001_001" + 0'

12

Od perlmodstyle: Version numbering

Jeśli chcesz wydać „beta” lub „alpha” wersję modułu ale nie chcą CPAN.pm notować je jako najnowsze używają znaku "_" po standardowej wersji , a następnie co najmniej 2 cyfry, np. 1,20_01. W takim przypadku zalecany jest następujący idiom:

  1. $ WERSJA = "1.12_01" ;
  2. $ XS_VERSION = $ WERSJA; # potrzebne tylko wtedy, gdy masz kod XS
  3. $ VERSION = eval $ WERSJA;

Z tej sztuczki MakeMaker będzie przeczytać tylko pierwszą linię, a więc czytać podkreślenia, podczas gdy interpreter perla oceni $ version i konwertować ciąg do liczby. Późniejsze operacje, które leczą $ version jak numer będzie mógł to zrobić bez prowokowania ostrzeżenie o $ version nie być numer.

Powiązane problemy