2012-11-09 10 views
8

Próbuję napisać test dla this bug. Znalazłem już rozwiązanie tego błędu; Nie mogę zrozumieć, dlaczego moje testy nie złapały błędu przed wydaniem.Dlaczego ładowanie Test :: More eliminuje mój błąd?

Problem sprowadza się do tego wiersza polecenia drukowania Ver: 0 kiedy to miało drukować Ver: 1.00:

perl -Mversion -e 'printf "Ver: %s\n", ("v1.00" =~ /v(.+)/ ? version->parse($1) : "no");' 

Jednakże, jeśli włożysz -MTest::More przed -Mversion, następnie drukuje Ver: 1.00.

Moje pytanie brzmi: dlaczego ładowanie Test::More zmienia zachowanie mojego kodu? (W przypadku punktów bonusowych, dlaczego użycie "$1" zamiast $1 eliminuje błąd?)

Używam Perl 5.14.2, Test :: Więcej 0,98 i wersja 0.88.

Odpowiedz

8

To błąd w wersji. $1 jest magicznym var, a wersja nie przetwarza magii przed sprawdzeniem czy arg jest zdefiniowany. Uważa, że ​​$1 jest niezdefiniowane, jeśli nikt nigdy nie czytał z $1. Jeśli ktoś przeczytał od $1 (np. Test :: więcej), to wydaje się być zdefiniowany jako wersja.

$ perl -Mversion -E' 
    "v1.00" =~ /v(.+)/ or die; 
    $x=$1 if $ARGV[0]; 
    say version->parse($1); 
' 0 
0 

$ perl -Mversion -E' 
    "v1.00" =~ /v(.+)/ or die; 
    $x=$1 if $ARGV[0]; 
    say version->parse($1); 
' 1 
1.00 

I złożyli raport o błędzie: Perl RT#115660

+0

Ok, więc zajęło mi trochę czasu, aby ustalić, że. Niech cię diabli, Leon! ;) – ikegami

+0

Leon był szybszy, ale ja lubię twoją odpowiedź lepiej (+ raport o błędzie), więc akceptuję twoją. – cjm

8
perl -Mversion -E 'sub TIESCALAR { bless {} }; sub FETCH { die "HERE" }; tie $foo, __PACKAGE__; say version->new($foo)' 

Wersja jest błędna, nie nazywa się magią poprawnie, więc nigdy nie zapełnia 1 $. Jeśli działa przy ładowaniu Testu :: Najpierw, to tylko dlatego, że nadal jest stara wartość w 1

Powiązane problemy