Vị trí của thông dịch viên perl hiện tại của bạn có thể được tìm thấy trong biến đặc biệt $^X
. Điều này quan trọng nếu perl không có trong đường dẫn của bạn, hoặc nếu bạn có nhiều phiên bản perl có sẵn nhưng để đảm bảo rằng bạn đang sử dụng cùng một phiên bản trên bảng.
Khi thực hiện các lệnh bên ngoài, bao gồm các chương trình Perl khác, xác định xem chúng có thực sự chạy có thể khá khó khăn không. Kiểm tra $?
có thể để lại vết sẹo dài tinh thần, vì vậy tôi thích sử dụng IPC::System::Simple (có sẵn từ CPAN):
use strict;
use warnings;
use IPC::System::Simple qw(system capture);
# Run a command, wait until it finishes, and make sure it works.
# Output from this program goes directly to STDOUT, and it can take input
# from your STDIN if required.
system($^X, "yourscript.pl", @ARGS);
# Run a command, wait until it finishes, and make sure it works.
# The output of this command is captured into $results.
my $results = capture($^X, "yourscript.pl", @ARGS);
Trong cả hai ví dụ trên bất kỳ đối số bạn muốn vượt qua chương trình bên ngoài của bạn đi vào @ARGS
. Vỏ cũng được tránh trong cả hai ví dụ trên, mang lại cho bạn lợi thế tốc độ nhỏ và tránh mọi tương tác không mong muốn liên quan đến các ký tự meta shell. Đoạn mã trên cũng mong đợi chương trình thứ hai của bạn trả về một giá trị thoát bằng 0 để biểu thị thành công; nếu đó không phải là trường hợp, bạn có thể chỉ định một cuộc tranh cãi đầu tiên bổ sung giá trị xuất cảnh cho phép:
# Both of these commands allow an exit value of 0, 1 or 2 to be considered
# a successful execution of the command.
system([0,1,2], $^X, "yourscript.pl", @ARGS);
# OR
capture([0,1,2, $^X, "yourscript.pl", @ARGS);
Nếu bạn có một quá trình lâu dài và bạn muốn xử lý dữ liệu của nó khi nó được tạo ra, sau đó bạn' có lẽ sẽ cần một đường ống mở, hoặc một trong những mô-đun IPC nặng hơn từ CPAN. Đã nói tất cả điều đó, bất cứ khi nào bạn cần gọi một chương trình Perl khác từ Perl, bạn có thể cân nhắc xem việc sử dụng mô-đun có phải là lựa chọn tốt hơn hay không. Bắt đầu một chương trình khác mang lại một vài chi phí, cả về chi phí khởi động và chi phí I/O cho việc di chuyển dữ liệu giữa các quá trình. Nó cũng làm tăng đáng kể độ khó xử lý lỗi. Nếu bạn có thể biến chương trình bên ngoài của bạn thành một mô-đun, bạn có thể thấy nó đơn giản hóa thiết kế tổng thể của bạn.
All the best,
Paul
Sẽ dễ dàng hơn và đơn giản hơn để chỉ sử dụng 'do'? – innaM
Cảm ơn. Tôi đã thêm 'do' vào danh sách. – Colin