Opcja wiersza poleceń -MO=Deparse
pokazuje, jak Perl zinterpretował twój kod po jego uproszczeniu (np. Konwersję heredoc do qq {} bloków). na przykład
$ perl -MO=Deparse test.pl
$i = 1;
while ($i < 3) {
print qq[ def px$i = new E(user) \n if (!px$i.hasErrors()) {\n println "${$i->px . 'name';}/${$i->px . 'empr' . 'to';} OK"\n }\n\n];
++$i;
}
Odpowiedni fragment brzmi:
println "${$i->px . 'name';}/${$i->px . 'empr' . 'to';}
Perl został przekształcony ${px$i.name}
do ${$i->px . 'name'}
!
W języku Perl, ${...}
oznacza ocenę tego, co znajduje się wewnątrz bloku, i traktuje to jako symbolic reference (tj. Nazwę zmiennej) lub odniesienie skalarne, a następnie usuwa je, aby przekształcić z powrotem w skalar. Tak więc Perl próbuje wykonać wszystko, co znajduje się wewnątrz tych bloków, traktując ich zawartość jako kod Perla. Dzieje się tak dlatego, że twój heredoc, "EOT"
jest jak łańcuch podwójnie cytowany i interpoluje znaki dolara.
Rozwiązanie: uciec od znaków dolara ($
->\$
) lub użyć pojedynczych cudzysłowów i konkatenacji zamiast heredocs.
Nie wiem, co to jest, ale na pewno nie jest to Perl. – friedo
Kod wewnątrz print/EOT na pewno nie, ale nie o to chodzi, potrzebuję tylko tego, co jest w środku print/EOT do zapisania na stdout; w rzeczywistości, jeśli usunę blok "if", działa idealnie. – xain
Doh - Tęskniłem za faktem, że materiał był w dużym heredoc. – friedo