Die语句在perl的foreach循环中不起作用

时间:2014-10-06 10:33:19

标签: perl

我的脚本从FTP下载文件并将文件移动到FTP中的存档目录。 我有一个模式来搜索FTP中的文件,并将它放在foreach循环中以将这些文件放到本地目录。

my $ftpUser     = 'xxxx';
my $ftpPW       = 'xxxxxx';
my $FTPHost     = "xxxxxxxxxxx";
my $remotefile  = 'CAP*.csv';
my $archivefile = "/usr/archive/CAP_${file_date_time}.csv";

my $ftp = Net::FTP->new($FTPHost);
$ftp->login( $ftpUser, $ftpPW ) or die print L1 "Could not login FTP :" . $ftp->message . "\n";
print L1 "Login to FTP was successfull\n";
$ftp->cwd("/")
    or die print L1 "ftp_cd failed: " . $ftp->message . "\n";
foreach my $file_to_fetch ( $ftp->ls($remotefile) ) {
    $ftp->get( $file_to_fetch, $localfile ) or die print L1 "Could not get file from FTP :" . $ftp->message . "\n";
    $remotefile = $file_to_fetch;
    print "\$file_to_fetch ::: $file_to_fetch\n";
    print L1 "File - ${file_to_fetch} Successfully Downloaded from FTP\n";
    $ftp->rename( $file_to_fetch, $archivefile )
        or die print L1 "Could not move file to archive directory :" . $ftp->message . "\n";
    print L1 "File - ${file_to_fetch} Moved to archive directory as CAP_${file_date_time}.csv\n";
}
$ftp->quit;

print L1 "FTP process was successfully completed\n";
if ( -s $localfile ) {
    open F1, "$localfile"
        or die( print L1 "$localfile cannot be opened for reading \n" );
} else {
    die( print L1 "$localfile does not exist \n" );
}

执行上面的代码时,如果我正在搜索的文件不存在于FTP中但是它没有打印die语句,那就是"无法从FTP获取文件"日志,而不是它来自FTP并继续下一组代码,即打印L1" FTP过程已成功完成\ n"。

请帮助我解决这些问题,为什么die语句不能在foreach中工作,如果它无法从FTP获取文件。

2 个答案:

答案 0 :(得分:2)

替换,

$ftp->get($file_to_fetch,$localfile) or die print L1 "Could not get file from FTP :" . $ftp->message ."\n";

$ftp->get($file_to_fetch,$localfile) or die "Could not get file from FTP :". $ftp->message ."\n";

在第一种情况下,dieprint()返回值作为参数而不是错误消息。

或者自己动手,

sub mydie {
  my ($msg) = @_;

  print L1 $msg;
  die $msg;
}

或者如果函数不是一个选项,

$ftp->get($file_to_fetch,$localfile) or do {

  print(L1 $_), die($_) for "Could not get file from FTP :". $ftp->message ."\n";
};

答案 1 :(得分:0)

您的问题因为您将print语句的返回值传递给die而产生了问题:

... or die print L1 "Could not get file from FTP :" . $ftp->message . "\n";

我怀疑您正在尝试将die语句的输出镜像到文件和STDERR。

如果是这种情况,那么我建议您执行以下操作:

  1. 将所有die print L1语句更改为die

  2. 从每条\n条消息中删除尾随换行符die,因为它会隐藏行号信息。

    $ftp->login( $ftpUser, $ftpPW )
        or die "Could not login FTP :" . $ftp->message;
    
  3. 创建一个$SIG{__DIE__}处理程序,将die输出镜像到文件句柄。

    local $SIG{__DIE__} = sub {
        print L1 @_;
        die @_;
    };