2009-03-03 15 views
24

Cách tốt nhất để lập trình khám phá tất cả các chương trình con một mô-đun perl là gì? Đây có thể là một mô-đun, một lớp (không có @ EXPORT), hoặc bất kỳ thứ gì ở giữa.Cách tốt nhất để khám phá tất cả các chương trình con mà một mô-đun Perl có là gì?

Chỉnh sửa: Tất cả các phương pháp bên dưới trông giống như chúng sẽ hoạt động. Tôi có thể sử dụng Class :: Sniff hoặc Class :: Inspector trong sản xuất. Tuy nhiên, câu trả lời của Leon được đánh dấu là 'chấp nhận' vì câu trả lời cho câu hỏi được đặt ra, mặc dù no strict 'refs' phải được sử dụng. :-) Class :: Sniff có thể là một lựa chọn tốt vì nó tiến triển; có vẻ như rất nhiều suy nghĩ đã đi vào nó.

Trả lời

22
sub list_module { 
    my $module = shift; 
    no strict 'refs'; 
    return grep { defined &{"$module\::$_"} } keys %{"$module\::"} 
} 

ETA: nếu bạn muốn lọc ra các chương trình con nhập khẩu, bạn có thể làm điều này

use B qw/svref_2object/; 

sub in_package { 
    my ($coderef, $package) = @_; 
    my $cv = svref_2object($coderef); 
    return if not $cv->isa('B::CV') or $cv->GV->isa('B::SPECIAL'); 
    return $cv->GV->STASH->NAME eq $package; 
} 

sub list_module { 
    my $module = shift; 
    no strict 'refs'; 
    return grep { defined &{"$module\::$_"} and in_package(\&{*$_}, $module) } keys %{"$module\::"} 
} 
+1

Điều này cũng sẽ liệt kê các chương trình con mô-đun được nhập từ các mô-đun khác. – innaM

+0

Điều đó sẽ có vấn đề. –

+0

Trên suy nghĩ thứ hai, nó cũng có thể là quan trọng, tùy thuộc vào ứng dụng. –

9

Có xem xét này: Class::Sniff

Giao diện khá ad-hoc tại thời điểm này và có khả năng thay đổi. Sau khi tạo một cá thể mới, gọi phương thức báo cáo là lựa chọn tốt nhất của bạn. Sau đó, bạn có thể kiểm tra trực quan để tìm các vấn đề tiềm ẩn:

my $sniff = Class::Sniff->new({class => 'Some::Class'}); 
print $sniff->report; 

Mô-đun này cố gắng giúp các lập trình viên tìm thấy 'mã mùi' trong mã hướng đối tượng. Nếu nó báo cáo một cái gì đó, nó không có nghĩa là mã của bạn là sai. Nó chỉ có nghĩa là bạn có thể muốn xem mã của bạn một chút chặt chẽ hơn để xem nếu bạn có bất kỳ vấn đề.

Tại thời điểm hiện tại, chúng tôi giả định thứ tự tìm kiếm theo chiều sâu trái nhất, theo chiều sâu của Perl. Chúng tôi có thể thay đổi điều này trong tương lai (và có một công việc xung quanh với phương pháp đường dẫn thêm về điều này sau.) ...

+0

Trông thú vị, nhưng khá mới. Tôi sẽ do dự khi sử dụng nó trong môi trường sản xuất. –

+2

Lý do nào bạn có thể có để có được danh sách các phương pháp trong môi trường sản xuất? – innaM

+1

Tôi quan tâm đến việc tạo mẫu thử nghiệm :: Lớp học như công cụ. Việc phát triển các nguyên mẫu khỏi mã không được kiểm tra khác có thể dẫn đến những cơn đau đầu lớn. :) –

12

Class::Inspector:

Class :: Inspector cho phép bạn để có được thông tin về một lớp được tải. Hầu hết hoặc tất cả thông tin này có thể được tìm thấy theo những cách khác, nhưng chúng không phải lúc nào cũng rất thân thiện, và thường liên quan đến trình độ Perl tương đối cao, hoặc mã tìm kiếm kỳ lạ và khác thường. Lớp :: Thanh tra cố gắng cung cấp giao diện thân thiện, dễ dàng hơn cho thông tin này ...

+0

Rất thú vị, tôi sẽ xem xét nó. –

+0

Đối với tôi, câu trả lời này tốt hơn Leon, vì tôi cần tất cả các phương pháp đối tượng (mọi thứ trong chuỗi kế thừa). –

+0

Sử dụng Class :: Trình kiểm tra từ bên trong trình gỡ lỗi perl cực kỳ hữu ích, cảm ơn. – muriloq