2015-07-09 21 views
7

Có điều sau đây:Trọng là "eval" trong perl

use 5.014; 
use warnings; 
BEGIN { 
    use subs qw(int); 
    sub int { 
     print STDERR "\tthe int got: $_[0]\n"; 
     my $res = CORE::int($_[0]); 
     print STDERR "\tCORE::int: $res\n"; 
     return $res; 
    } 
} 

my $x; 
$x = 1.1 ; say "result of int($x) is: ", int($x); 
$x = 6.6 ; say "result of int($x) is: ", int($x); 

nó in

the int got: 1.1 
    CORE::int: 1 
result of int(1.1) is: 1 
    the int got: 6.6 
    CORE::int: 6 
result of int(6.6) is: 6 

Chức năng int được ghi đè bởi chức năng của riêng tôi, mà hiện một số debug-in, và trả về kết quả của việc thực hiện bản gốc (CORE).

Tìm kiếm tương tự cho số eval. Tuy nhiên, có lẽ vì eval không phải là chức năng như số ghi đè như trên int như trên không hoạt động đối với eval.

Có thể đạt được điều này một chút không? Ví dụ. muốn ghi đè lên eval (các eval "$string") với eval của riêng tôi như trên, ví dụ:

  • nên in chuỗi có
  • và nên gọi việc thực hiện cốt lõi của eval

EDIT: Theo để bình luận ở trên là không thể cho các eval. Vì vậy:

Tóm lại: muốn in gỡ lỗi tất cảeval "$strings" trong chương trình của tôi trước khi đánh giá. Có thể có phần nào?

+1

Ít nhất phải đăng ký http://perldoc.perl.org/CORE.html có vẻ như 'eval' không tồn tại dưới dạng' CORE :: eval', điều tôi tin là có nghĩa là từ khóa Perl thiếu một phương tiện bị ghi đè. – DavidO

+0

@DavidO Được chứng thực bởi [câu trả lời này] (http://stackoverflow.com/a/3678957/176646) cho một câu hỏi liên quan. – ThisSuitIsBlackNot

+2

['overload :: eval'] (https://metacpan.org/pod/overload::eval) – ThisSuitIsBlackNot

Trả lời

5

eval không thể bị ghi đè theo cùng kiểu như int vì giao diện của nó không thể được tạo mẫu.

$ perl -E'say prototype("CORE::".$ARGV[0]) // "[undef]"' int 
_ 

$ perl -E'say prototype("CORE::".$ARGV[0]) // "[undef]"' eval 
[undef] 

Nhưng có một số tin vui! Ai đó có nhu cầu tương tự với bạn, đã giải quyết nó bằng cách thao tác mã opcode và xuất bản giải pháp cho CPAN dưới dạng overload::eval để mọi người sử dụng.

Tài liệu tuyên bố chỉ ảnh hưởng đến eval trong phạm vi từ vựng của use, nhưng có một cờ ẩn $overload::eval::GLOBAL = 1; làm cho ảnh hưởng đến tất cả các cuộc gọi đến eval EXPR.

+0

Cảm ơn bạn đã chỉ cho tôi' overload :: eval', tiếc là nó không instal sạch (kiểm tra thất bại) trong OSX/perl-v5.22. – kobame

Các vấn đề liên quan