Komut satırı seçeneği -MO=Deparse
, Perl'in basitleştirdikten sonra kodunuzu nasıl yorumladığını gösterir (örneğin, heredoc'u qq {} bloklarına dönüştürme). Örneğin.
$ 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;
}
ilgili parçasıdır:
println "${$i->px . 'name';}/${$i->px . 'empr' . 'to';}
Perl ${$i->px . 'name'}
için ${px$i.name}
dönüştüğü! Perlde
, ${...}
blok içinde ne olursa olsun değerlendirmek ve bir sayısal geri çevirmek için daha sonra KQUEUE, bir symbolic reference (yani, bir değişken adı) veya skalar referans olarak ele alınır. Böylece Perl, bu blokların içinde ne varsa onu yürütmeye çalışır, onların içeriğini Perl kodu olarak ele alır. Bunun nedeni, heredoc, "EOT"
'un çift tırnaklı bir dizgiye benzemesi ve dolar işaretlerini enterpolasyonudur.
Çözüm: dolar işaretlerinden kaçının ($
->\$
) veya tekdüzenler yerine tek tırnak ve birleştirme kullanın.
Bunun ne olduğunu bilmiyorum, ama kesinlikle Perl değil. – friedo
Baskı/EOT içerisindeki kod kesinlikle değil, ancak işin aslı, baskıya/EOT'un içine yazılacak olana ihtiyacım var; Aslında "if" bloğunu kaldırırsam, mükemmel çalışır. – xain
Doh - Eşyaların büyük bir heredokta olduğu gerçeğini kaçırdım. – friedo