2009-09-17 33 views
8

Mã Perl sau ..Làm cách nào để tôi chỉ có thể sử dụng mô-đun Perl nếu tôi sử dụng Windows?

if ($^O eq "MSWin32") { 
    use Win32;                                               
    .. do windows specific stuff .. 
} 

.. làm việc trong môi trường Windows, nhưng thất bại trong việc chạy theo tất cả các nền tảng khác ("Không thể xác định vị trí Win32.pm trong @ INC"). Làm cách nào để hướng dẫn Perl thử nhập Win32 chỉ khi chạy trong Windows và bỏ qua lệnh nhập trong tất cả nền tảng khác?

Trả lời

20

Mã này sẽ làm việc trong mọi tình huống, và cũng có thể thực hiện tải tại thời gian biên dịch, như các module khác bạn đang xây dựng có thể phụ thuộc vào nó:

BEGIN { 
    if ($^O eq "MSWin32") 
    { 
     require Module; 
     Module->import(); # assuming you would not be passing arguments to "use Module" 
    } 
} 

Điều này là do use Module (qw(foo bar)) tương đương với BEGIN { require Module; Module->import(qw(foo bar)); } như mô tả trong perldoc -f use.

(EDIT, một vài năm sau đó ...)

này thậm chí còn tốt hơn mặc dù:

use if $^O eq "MSWin32", Module; 

Tìm hiểu thêm về if pragma here.

+0

damn, Ether đánh tôi với nó! – singingfish

+0

* 'Bareword" Module "không được phép trong khi" strict subs "đang được sử dụng ...' * - nó trông rất đẹp từ khoảng cách ... – jww

+0

@jww Bạn phải thay thế "Module" bằng tên module thực tế mà bạn muốn tải. Và không gian tên đó cần được khai báo trong tệp với câu lệnh 'package'. – Ether

3

Nói chung, use Module hoặc use Module LIST được đánh giá vào thời gian biên dịch bất kể chúng xuất hiện ở đâu trong mã. Thời gian chạy tương đương là

require Module; 
Module->import(LIST) 
1

require Module;

Nhưng use cũng kêu gọi import, require không. Do đó, nếu mô-đun xuất sang không gian tên mặc định, bạn cũng nên gọi

import Module qw(stuff_to_import);

Bạn cũng có thể eval "use Module" - hoạt động tuyệt vời IF perl có thể tìm thấy đường dẫn thích hợp khi chạy.

+6

Không sử dụng các cuộc gọi phương pháp gián tiếp, họ không thực hành tốt nhất bởi một shot dài. Do 'Module-> import (qw (stuff));' thay vào đó. – Danny

11

Là một phím tắt cho chuỗi:

BEGIN { 
    if ($^O eq "MSWin32") 
    { 
     require Win32; 
     Win32::->import(); # or ...->import(your-args); if you passed import arguments to use Win32 
    } 
} 

bạn có thể sử dụng nếu pragma:

use if $^O eq "MSWin32", "Win32"; # or ..."Win32", your-args; 
Các vấn đề liên quan