2010-04-01 36 views
25

Trong Perl chúng ta có thể lấy tên của gói hiện tại và số dòng hiện tại Sử dụng các biến được xác định trước như __PACKAGE____LINE__.Làm thế nào tôi có thể lấy tên của chương trình con hiện tại trong Perl?

Như thế này tôi muốn để có được tên của chương trình con hiện tại:

use strict; 
use warnings; 

print __PACKAGE__; 
sub test() 
{ 
    print __LINE__; 
} 
&test(); 

Trong đoạn mã trên tôi muốn để có được tên của chương trình con bên trong hàm test.

+1

sản lượng gì bạn muốn nếu chương trình con hiện nay là vô danh? –

+5

'sub test() {}' định nghĩa một hàm với nguyên mẫu "()". Tôi đoán bạn muốn 'kiểm tra phụ {}' –

+0

Ngoài ra, không đặt dấu "(&') trước khi bạn gọi chương trình con vì nó có thể không làm những gì bạn nghĩ. – mpeters

Trả lời

16

caller là cách phù hợp để thực hiện tại @eugene pointed out nếu bạn muốn thực hiện việc này bên trong chương trình con.

Nếu bạn muốn một phần khác của chương trình của bạn có thể xác định gói và tên thông tin cho một coderef, hãy sử dụng Sub::Identify.

Ngẫu nhiên, nhìn vào

sub test() 
{ 
    print __LINE__; 
} 
&test(); 

có một vài điểm quan trọng để đề cập đến: Thứ nhất, không sử dụng prototypes trừ khi bạn đang cố gắng để bắt chước builtins. Thứ hai, không sử dụng & khi invoking a subroutine trừ khi bạn đặc biệt cần các hiệu ứng mà nó cung cấp.

Do đó, đoạn mã được viết tốt hơn như:

sub test 
{ 
    print __LINE__; 
} 
test(); 
49

Sử dụng caller() chức năng:

my $sub_name = (caller(0))[3];

này sẽ cung cấp cho bạn tên của chương trình con hiện nay, bao gồm cả gói của nó (ví dụ 'main::test'). Đóng cửa trả lại tên như 'main::__ANON__' và trong eval nó sẽ là '(eval)'.

+3

cung cấp cho bạn chính :: __ ANON__ cho một phụ ẩn danh (hoặc foo :: __ ANON__ nếu phụ ẩn danh được định nghĩa trong gói 'foo ') – mirod

+7

@mirod: 'local * __ ANON__ =" foo ";' - điều này có thể được sử dụng để đặt tên cho các chương trình con ẩn danh. –

+0

đẹp! (không phải là tôi sẽ làm điều đó tất nhiên ...) – mirod

0

Có đặc biệt __SUB__ tồn tại từ perl-5.16.

use v5.16; 
use Sub::Identify qw/sub_fullname/; 
sub foo { 
    print sub_fullname(__SUB__); # main::foo 
} 

foo(); 

Trên thực tế bạn có thể vượt qua để sub_fullname bất kỳ tài liệu tham khảo chương trình con (thậm chí vô danh):

use Sub::Identify qw/sub_fullname/; 
sub foo { 
    print sub_fullname(\&foo); # main::foo 
    print sub_fullname(sub{}); # main::__ANON__ 
} 

foo(); 
+0

Và nếu ai đó muốn đặt tên cho '__ANON__' xem [tại đây] (http://www.perlmonks.org/?node_id = 395912) –

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