2014-04-05 11 views
6

Poniższy kod wysyła nic:String konkatenacji w Perlu involing wyjście z funkcji i jak

print (1 == 2)."a"; 

jak czyni to:

print qw< One Two Three > . "a"; 

Ale to wyprowadza bałwana, po której następuje litera A, zgodnie z oczekiwaniami:

print chr(0x2603)."a"; 

Czy istnieje ogólna metoda łączenia ogólnych "rzeczy", z powodu braku lepszego słowa (takiego jak wynik funkcji i wyniki porównań boolowskich) z fragmentami napisów, które zawsze działają? Ponieważ operator . nie wydaje się być niezawodny.

Odpowiedz

12

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; 
+0

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. –