Nếu đối sánh cụm từ thông dụng xảy ra bên trong một eval, các thay đổi đối với các biến liên quan đến chụp ($ 1, v.v.) không hiển thị trong môi trường bên ngoài. Đây có phải là một lỗi?
perlop và perlre dường như không đề cập đến bất kỳ hạn chế nào như vậy.
Ví dụ:
use strict; use warnings;
$_ = "hello";
eval '/(.*)/';
print "GOT: $1\n";
cho:
Use of uninitialized value $1 in concatenation (.) or string at -e line 1.
GOT:
Một bản demo ngắn gọn hơn là:
perl -we '$_="foo"; eval q(/(.*)/;) ; print "GOT:$1\n";'
Tôi đã từng nghĩ về '$ 1' (và' $ & ', cho vấn đề đó) dưới dạng * biến toàn cục * chứ không phải * từ * lexical *. – Lumi
@Lumi chúng là toàn cầu nhưng được khai báo hoàn toàn chỉ bằng lần sử dụng đầu tiên (xem ví dụ trong câu trả lời của tôi) – Matteo
@Matteo - Không, khái niệm * tuyên bố * biến toàn cầu (thực sự * gói * biến) trong Perl là gây hiểu nhầm. Không cần phải khai báo chúng, không phải những thông tin được tích hợp sẵn cũng như không có người dùng nào có thể thêm vào. Chúng chỉ là những giá trị được lưu trữ trong một không gian tên.* Cần khai báo hoặc trình độ đầy đủ * chỉ phát sinh với 'pragma' nghiêm ngặt: 'khai báo' của tôi, 'khai báo' của chúng tôi (kèm theo gói nhưng bị lốm đốm), hoặc đủ điều kiện của các hình cầu không có sẵn. – Lumi