Don 't sử dụng vỏ, sau đó.
#! /usr/bin/perl
use warnings;
use strict;
use Cwd;
use POSIX qw/ strftime /;
my $date = localtime;
my $datef = strftime "%Y%m%d%H%M.%S", localtime;
my $pwd = getcwd;
Kết quả là hơi khác nhau: đầu ra của lệnh date
chứa một múi giờ, nhưng giá trị của $date
trên sẽ không. Nếu đây là sự cố, hãy làm theo đề xuất tuyệt vời bằng cách Chas. Owens bên dưới và sử dụng strftime
để nhận định dạng bạn muốn.
tiểu của bạn
sub touchandmail {
`touch $cache -t "$datef"`;
`echo "$msg" | mail -s "$subject" $owner -c $sendto`;
}
sẽ thất bại âm thầm nếu họ gặp khó khăn. Im lặng thất bại là khó chịu. Tốt hơn sẽ là mã dọc theo dòng của
sub touchandmail {
system("touch", "-t", $datef, $cache) == 0
or die "$0: touch exited " . ($? >> 8);
open my $fh, "|-", "mail", "-s", $subject, $owner, "-c", $sendto
or die "$0: could not start mail: $!";
print $fh $msg
or warn "$0: print: $!";
unless (close $fh) {
if ($! == 0) {
die "$0: mail exited " . ($? >> 8);
}
else {
die "$0: close: $!";
}
}
}
Sử dụng system
hơn backticks là biểu cảm hơn về ý định của mình vì backticks là để chụp đầu ra. Biểu mẫu system(LIST)
bỏ qua trình bao và phải lo lắng về việc trích dẫn đối số.
Lấy hiệu ứng của đường ống vỏ echo ... | mail ...
mà không có vỏ có nghĩa là chúng ta phải làm một chút công việc hệ thống ống nước, nhưng lợi ích — như với system(LIST)
—không phải lo lắng về việc trích dẫn vỏ. Đoạn mã trên sử dụng nhiều đối số open
:
Đối với ba hoặc nhiều đối số nếu THỨC là '|-'
, tên tập tin được hiểu như là một lệnh mà đầu ra là để được cấp nước tập trung, và nếu chế độ là '-|'
, tên tập tin được giải thích như một lệnh mà đầu ra ống cho chúng tôi.Trong biểu mẫu hai đối số (và một đối số), bạn nên thay thế dấu gạch ngang ('-'
) bằng lệnh. Xem Using open
for IPC in perlipc để biết thêm ví dụ về điều này.
open
trên dĩa ở trên mail
và $fh
được kết nối với đầu vào tiêu chuẩn. Quy trình gốc (mã vẫn chạy touchandmail
) thực hiện vai trò là echo
với print $fh $msg
. Gọi close
bừng của cán bộ đệm O I/cộng thêm một chút vì cách chúng tôi mở nó ra:
Nếu filehandle xuất thân từ một đường ống open
, close
lợi nhuận false nếu một trong những syscalls khác liên quan đến thất bại hoặc nếu chương trình của mình thoát với trạng thái khác 0. Nếu vấn đề duy nhất là chương trình đã thoát không khác, $!
sẽ được đặt thành 0. Đóng một đường ống cũng đợi quá trình thực thi trên đường ống để thoát - trong trường hợp bạn muốn xem đầu ra của ống sau đó — và ngầm đặt giá trị trạng thái thoát của lệnh đó vào $?
và ${^CHILD_ERROR_NATIVE}
.
Bạn cũng nên nhớ rằng 'chomp' có thể lấy một danh sách:' chomp ($ foo, $ bar, $ fubb) '. – FMc