Don No uses el caparazón, entonces.
#! /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;
El resultado es ligeramente diferente: la salida del comando date
contiene una zona horaria, pero el valor de $date
anterior no. Si esto es un problema, siga la sugerencia excelente al Chas. Owens a continuación y use strftime
para obtener el formato que desea.
Su sub
sub touchandmail {
`touch $cache -t "$datef"`;
`echo "$msg" | mail -s "$subject" $owner -c $sendto`;
}
fallará silenciosamente si algo va mal. Las fallas silenciosas son desagradables. Mejor código sería lo largo de las líneas de
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: $!";
}
}
}
Usando system
en lugar de acentos abiertos es más expresivo de su intención, porque son invertidas para la captura de salida. El formulario system(LIST)
omite el shell y tiene que preocuparse por citar argumentos.
Obtener el efecto de la tubería de la carcasa echo ... | mail ...
sin la carcasa significa que tenemos que hacer un poco el trabajo de fontanería nosotros mismos, pero el beneficio -como con system(LIST)
- no es tener que preocuparse por las cotizaciones de la carcasa. El código anterior utiliza muchos argumento open
:
Durante tres o más argumentos si el modo es '|-'
, el nombre del archivo se interpreta como una orden para que la producción debe ser canalizado, y si el modo es '-|'
, se interpreta el nombre del archivo como un comando que nos canaliza la salida.En el formulario de dos argumentos (y un argumento), se debe reemplazar el guión ('-'
) con el comando. Ver Using open
for IPC in perlipc para más ejemplos de esto.
El open
anteriormente horquillas un proceso mail
, y $fh
está conectada a su entrada estándar. El proceso primario (el código sigue ejecutándose touchandmail
) realiza el rol de echo
con print $fh $msg
. Llamando close
los buffers de E/S además del mango un poco más por la forma en la abrimos:
Si el gestor de archivo vino de un hilo open
, close
devuelve false si una de las otras llamadas al sistema que participan falla o si su programa sale con un estado distinto de cero. Si el único problema fue que el programa salió distinto de cero, $!
se establecerá en 0. Cerrar una tubería también espera que el proceso que se ejecuta en la tubería salga, en caso de que desee ver la salida de la tubería después, y coloca implícitamente el valor de estado de salida de ese comando en $?
y ${^CHILD_ERROR_NATIVE}
.
También es útil recordar que 'chomp' puede tomar una lista:' chomp ($ foo, $ bar, $ fubb) '. – FMc