Đây là lệnh perlpragma có thể được chạy trong nhà cung cấp dịch vụ lưu trữ miễn phí OnWorks bằng cách sử dụng một trong nhiều máy trạm trực tuyến miễn phí của chúng tôi như Ubuntu Online, Fedora Online, trình giả lập trực tuyến Windows hoặc trình giả lập trực tuyến MAC OS
CHƯƠNG TRÌNH:
TÊN
perlpragma - cách viết pragma người dùng
MÔ TẢ
Một pragma là một mô-đun ảnh hưởng đến một số khía cạnh của thời gian biên dịch hoặc thời gian chạy
hành vi của Perl, chẳng hạn như "nghiêm ngặt" hoặc "cảnh báo". Với Perl 5.10, bạn không còn
giới hạn trong thực dụng được xây dựng; bây giờ bạn có thể tạo dữ liệu người dùng để sửa đổi
hành vi của các chức năng người dùng trong một phạm vi từ vựng.
A cơ bản ví dụ
Ví dụ: giả sử bạn cần tạo một lớp triển khai toán học quá tải
và muốn cung cấp pragma của riêng bạn có chức năng giống như "sử dụng
số nguyên; "Bạn muốn mã này
sử dụng MyMaths;
my $ l = MyMaths-> new (1.2);
my $ r = MyMaths-> new (3.4);
print "A:", $ l + $ r, "\ n";
sử dụng myint;
print "B:", $ l + $ r, "\ n";
{
không có gợi ý;
print "C:", $ l + $ r, "\ n";
}
print "D:", $ l + $ r, "\ n";
không có gợi ý;
print "E:", $ l + $ r, "\ n";
để đưa ra đầu ra
A: 4.6
B: 4
C: 4.6
Đ: 4
E: 4.6
tức là, nơi "sử dụng myint;" có hiệu lực, các phép toán cộng bị buộc thành số nguyên, trong khi
theo mặc định thì không, với hành vi mặc định được khôi phục thông qua "no myint;"
Việc triển khai tối thiểu của gói "MyMaths" sẽ giống như sau:
gói MyMaths;
cảnh báo sử dụng;
Sử dụng nghiêm ngặt;
sử dụng myint ();
sử dụng quá tải '+' => sub {
của tôi ($ l, $ r) = @_;
# Vượt qua 1 để kiểm tra một cấp độ cuộc gọi từ đây
nếu (myint ::in_effect(1)) {
int ($$ l) + int ($$ r);
} Else {
$$ l + $$ r;
}
};
sub mới {
của tôi ($ class, $ value) = @_;
ban phước cho \ $ value, $ class;
}
1;
Lưu ý cách chúng tôi tải người dùng pragma "myint" với một danh sách trống "()" để ngăn chặn "nhập" của nó
được gọi là.
Tương tác với biên dịch Perl xảy ra bên trong gói "myint":
gói myint;
Sử dụng nghiêm ngặt;
cảnh báo sử dụng;
nhập phụ {
$ ^ H {"myint / in_effect"} = 1;
}
không quan trọng phụ {
$ ^ H {"myint / in_effect"} = 0;
}
phụ in_effect {
my $ level = shift // 0;
my $ hinthash = (caller ($ level)) [10];
return $ hinthash -> {"myint / in_effect"};
}
1;
Vì pragmata được triển khai dưới dạng mô-đun, giống như bất kỳ mô-đun nào khác, "use myint;" trở thành
BẮT ĐẦU {
yêu cầu myint;
myint-> import ();
}
và "không có gợi ý;" Là
BẮT ĐẦU {
yêu cầu myint;
myint-> unimport ();
}
Do đó, các thủ tục "nhập" và "không quan trọng" được gọi là biên dịch thời gian cho mã của người dùng.
Dữ liệu thực dụng của người dùng lưu trữ trạng thái của họ bằng cách ghi vào hàm băm kỳ diệu "% ^ H", do đó hai hàm này
thói quen thao tác nó. Thông tin trạng thái trong "% ^ H" được lưu trữ trong optree và có thể được
được truy xuất ở chế độ chỉ đọc trong thời gian chạy với "caller ()", tại chỉ mục 10 của danh sách trả về
kết quả. Trong ví dụ pragma, truy xuất được đóng gói trong quy trình "in_effect ()",
lấy làm tham số là số khung cuộc gọi đi lên để tìm giá trị của
pragma trong tập lệnh của người dùng. Điều này sử dụng "caller ()" để xác định giá trị của
$ ^ H {"myint / in_effect"} khi mỗi dòng trong tập lệnh của người dùng được gọi và do đó
cung cấp ngữ nghĩa chính xác trong chương trình con thực hiện việc bổ sung nạp chồng.
Key đặt tên
Chỉ có một "% ^ H" duy nhất, nhưng nhiều mô-đun tùy ý muốn sử dụng phạm vi của nó
ngữ nghĩa. Để tránh giẫm lên ngón chân của nhau, họ cần đảm bảo sử dụng
các phím trong hàm băm. Do đó, thông thường một mô-đun chỉ sử dụng các phím bắt đầu
với tên của mô-đun (tên của gói chính của nó) và một ký tự "/". Sau đây
tiền tố nhận dạng mô-đun, phần còn lại của khóa hoàn toàn phụ thuộc vào mô-đun: nó có thể
bao gồm bất kỳ ký tự nào. Ví dụ: một mô-đun "Foo :: Bar" phải sử dụng các khóa như
là "Foo :: Bar / baz" và "Foo :: Bar / $% / _!". Các mô-đun tuân theo quy ước này đều hoạt động tốt
với nhau
Lõi Perl sử dụng một số ít các khóa trong "% ^ H" không tuân theo quy ước này, bởi vì
họ có trước nó. Các phím tuân theo quy ước sẽ không xung đột với các phím của lõi
khóa lịch sử.
Thực hiện chi tiết
Optree được chia sẻ giữa các chủ đề. Điều này có nghĩa là có khả năng lựa chọn
sẽ tồn tại lâu hơn chuỗi cụ thể (và do đó là phiên bản thông dịch) đã tạo
nó, vì vậy các vô hướng Perl đúng không thể được lưu trữ trong optree. Thay vào đó, một biểu mẫu nhỏ gọn được sử dụng,
chỉ có thể lưu trữ các giá trị là số nguyên (có dấu và không dấu), chuỗi hoặc "undef" -
tham chiếu và giá trị dấu phẩy động được chuỗi. Nếu bạn cần lưu trữ nhiều
giá trị hoặc cấu trúc phức tạp, bạn nên tuần tự hóa chúng, ví dụ với "pack". Các
việc xóa khóa băm khỏi "% ^ H" được ghi lại và như mọi khi có thể được phân biệt với
sự tồn tại của một khóa có giá trị "undef" với "tồn tại".
Đừng cố gắng lưu trữ các tham chiếu đến cấu trúc dữ liệu dưới dạng số nguyên được truy xuất qua
"người gọi" và được chuyển đổi trở lại, vì điều này sẽ không an toàn. Quyền truy cập sẽ là
cấu trúc không có khóa (không an toàn cho các đại lượng vô hướng của Perl) và cả cấu trúc
phải bị rò rỉ hoặc nó phải được giải phóng khi luồng tạo của nó kết thúc, điều này có thể
trước khi tham chiếu optree, nó sẽ bị xóa, nếu các luồng khác tồn tại lâu hơn nó.
Sử dụng perlpragma trực tuyến bằng các dịch vụ onworks.net