2010-10-15 12 views
13

tôi muốn làm một cái gì đó như thế này trong Perl:Tôi có thể sử dụng mô-đun theo cách có điều kiện trong Perl như thế nào?

$Module1="ReportHashFile1"; # ReportHashFile1.pm 
$Module2="ReportHashFile2"; # ReportHashFile2.pm 

if(Condition1) 
{ 
    use $Module1; 
} 
elsif(Condition2) 
{ 
    use $Module2; 
} 

ReportHashFile * .pm chứa một ReportHashFile gói *.

Ngoài ra cách tham khảo một mảng bên trong mô-đun dựa trên tên mô-đun động?

@Array= @$Module1::Array_inside_module; 

Tôi có thể đạt được điều này không. Một số loại trình biên dịch chỉ thị?

Trả lời

22

Bạn có thể tìm thấy mô-đun if hữu ích cho việc này.

Nếu không, ý tưởng cơ bản là sử dụng require, xảy ra vào thời gian chạy, thay vì use, xảy ra vào thời gian biên dịch. Lưu ý rằng '

BEGIN { 
    my $module = $condition ? $Module1 : $Module2; 
    my $file = $module; 
    $file =~ s[::][/]g; 
    $file .= '.pm'; 
    require $file; 
    $module->import; 
} 

Đối với địa chỉ globals, có thể dễ dàng hơn nếu bạn chỉ xuất biến hoặc hàm trả về cho người gọi mà bạn có thể sử dụng bằng tên không đủ điều kiện của nó. Nếu không, cũng có khả năng sử dụng một phương thức và gọi nó là $Module->method_name.

Hoặc, bạn có thể sử dụng các tham chiếu tượng trưng như được ghi trong perlref. Tuy nhiên, đó thường là một mùi mã.

my @array = do { 
    no strict 'refs'; 
    @{ ${ "${Module}::Array_inside_module" } }; 
}; 
+0

+1 để giải quyết "Làm cách nào để gọi phương thức có cùng tên từ bất kỳ mô-đun nào tôi đã tải" :) – DVK

+0

Tôi thường ném một eval vào đó trong trường hợp bạn không thể tải mô-đun. Tôi thích tắt mọi thứ một cách độc đáo thay vì nhìn thấy cái đống khủng khiếp của @INC mà perl phun ra. :) –

5

dân đã nói với bạn như thế nào bạn có thể tải các module với Perl nguyên thủy. Ngoài ra còn có Module::Load::Conditional.

Nếu bạn đang tìm cách truy cập vào một mảng cùng tên cho dù bạn đã tải mô-đun nào, hãy cân nhắc tạo phương thức để bạn có thể bỏ qua nội dung tham chiếu tượng trưng. Cung cấp cho mỗi mô-đun một phương pháp cùng tên:

package ReportHashFileFoo; 
    our @some_package_variable; 
    sub get_array { \@some_package_variable } 

Sau đó, khi bạn nạp rằng mô-đun:

if(... some condition ...) { 
     eval "use $module" or croak ...; 
     my $array_ref = $module->get_array; 
     } 

Tôi không biết những gì bạn đang thực sự làm (XY Problem), nhưng có lẽ một thiết kế tốt hơn. Khi mọi thứ có vẻ phức tạp như thế này, nó thường là vì bạn đang nhìn một cách tốt hơn để đến nó.