Tùy chọn dòng lệnh -MO=Deparse
cho bạn biết cách Perl đã giải thích mã của bạn sau khi đơn giản hóa nó (ví dụ: chuyển đổi heredocs thành qq {} khối). ví dụ.
$ 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;
}
Phần liên quan là:
println "${$i->px . 'name';}/${$i->px . 'empr' . 'to';}
Perl đã chuyển đổi ${px$i.name}
-${$i->px . 'name'}
!
Trong perl, ${...}
có nghĩa là đánh giá mọi thứ nằm trong khối và coi nó là symbolic reference (ví dụ: tên biến) hoặc tham chiếu vô hướng, sau đó bỏ qua nó để biến nó trở thành vô hướng. Vì vậy, Perl cố gắng thực hiện bất cứ điều gì là bên trong các khối, xử lý nội dung của họ như là mã Perl. Điều này là do heredoc của bạn, "EOT"
giống như một chuỗi được trích dẫn kép và nội suy các ký hiệu đô la.
Giải pháp là: thoát khỏi các ký hiệu đô la của bạn ($
->\$
) hoặc sử dụng dấu nháy đơn và nối hơn là heredocs.
Tôi không biết đó là gì, nhưng chắc chắn không phải là Perl. – friedo
Mã bên trong bản in/EOT chắc chắn không phải vậy, nhưng đó không phải là vấn đề, tôi chỉ cần những gì bên trong bản in/EOT được ghi vào stdout; trên thực tế, nếu tôi xóa khối "if", nó sẽ chạy hoàn hảo. – xain
Doh - Tôi đã bỏ lỡ thực tế rằng các công cụ đã được trong một heredoc lớn. – friedo