Jest to oczekiwane zachowanie ze względu na sposób działania list i kontekstów w Perlu.
Co się dzieje
Linia
print (1 == 2)."a";
jest analizowany tak:
(print(1 == 2) . "a")
Od 1==2
zwraca pusty ciąg znaków, nic nie zostanie wydrukowany. Zwracana wartość z print
jest następnie łączona z a
i odrzucana.
Gdybyś włączony use warnings
(które należy zawsze wraz z use strict
) byś widział:
print (...) interpretowane jako funkcja na -e linii 1.
Useless zastosowanie (łączenie). lub łańcucha w związku z pustych w -e linii 1.
linia
print qw< One Two Three > . "a";
Czy faktycznie drukować ciąg Threea
. To dlatego, że qw< One Two Three >
jest odpowiednikiem wyrażenia ('One', 'Two', 'Three')
. Operator konkatenacji .
umieszcza to wyrażenie w kontekście skalarnym, a zachowanie operatora przecinka w kontekście skalarnym polega na zwróceniu jego prawego argumentu. Wyrażenie zatem zmniejsza się do Threea
. Ponownie, jeśli miał warnings
, ty byłby widziany:
Useless stosowanie stałej („One”) w kontekście void na -e linii 1.
Useless stosowanie stałej („dwa”) w pustym kontekście w linii -1.
Morał z tej historii
use strict;
use warnings;
Ostrzeżenia są użyteczne, niestety (1) Te szczególne ostrzeżenia byłoby niezwykle tajemnicze rozpoczęciem programistów i może rzucać doświadczonych programistów do pętli, oraz (2) biorąc pod uwagę informacje dostępne dla tłumacza, nie wyobrażam sobie uzyskania ostrzejszych ostrzeżeń o tych problemach. –