Don w takim razie użyj powłoki.
#! /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;
Wynik jest nieco inna: wyjście komendy date
zawiera strefę czasową, ale wartość $date
powyżej nie będzie. Jeśli to jest problem, postępuj zgodnie z doskonałą sugestią podaną poniżej przez Chas. Owens i użyj formatu strftime
, aby uzyskać żądany format.
Twój sub
sub touchandmail {
`touch $cache -t "$datef"`;
`echo "$msg" | mail -s "$subject" $owner -c $sendto`;
}
zawiedzie cicho, jeśli coś pójdzie nie tak. Ciche niepowodzenia są nieprzyjemne. Lepiej byłoby kod wzdłuż linii
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: $!";
}
}
}
Korzystanie system
zamiast backticks jest bardziej wyrazisty swojej intencji bo backticks są do przechwytywania danych wyjściowych. Formularz system(LIST)
pomija powłokę i musi martwić się cytowaniem argumentów.
Uzyskanie efektu powłoki rurociągu echo ... | mail ...
bez powłoki oznacza, że musimy sami wykonać prace hydrauliczne, ale korzyści - podobnie jak w przypadku system(LIST)
- nie muszą martwić się o cytowanie powłoki. Powyższy kod wykorzystuje wiele-argumentu open
:
Przez trzy lub więcej argumentów Jeśli tryb jest '|-'
, nazwa pliku jest interpretowana jako polecenie, do którego wyjście ma być wyprowadzony, a jeżeli TRYB jest '-|'
, nazwa pliku jest interpretowana jako polecenie, które potoki wyprowadzają do nas.W dwuargumentowej (i jednoargumentowej) formie należy zastąpić myślnik ('-'
) poleceniem. Więcej przykładów na ten temat można znaleźć w artykule Using open
for IPC in perlipc.
open
powyżej widłami proces mail
i $fh
jest podłączony do standardowego wejścia. Proces macierzysty (kod nadal działający touchandmail
) pełni rolę echo
z print $fh $msg
. Wywołanie close
wypłukuje uchwytu za I/bufory O plus trochę więcej, ponieważ, jak otworzyliśmy go:
Jeśli filehandle pochodził z rurami open
, close
zwraca false, jeżeli jeden z pozostałych syscalli zaangażowanych awarii lub jeżeli jej programu wychodzi z niezerowym stanem. Jeśli jedyny problem polegał na tym, że program zakończył się niezerowo, $!
zostanie ustawiony na 0. Zamknięcie rury również czeka na zakończenie procesu na rurze - w przypadku, gdy chcesz spojrzeć na wyjście rury - i niejawnie umieszcza wartość statusu wyjścia tej komendy na $?
i ${^CHILD_ERROR_NATIVE}
.
Warto również pamiętać, że 'chomp' może przyjmować listę:' chomp ($ foo, $ bar, $ fubb) '. – FMc