我的脚本从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获取文件。
答案 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";
在第一种情况下,die
将print()
返回值作为参数而不是错误消息。
或者自己动手,
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。
如果是这种情况,那么我建议您执行以下操作:
将所有die print L1
语句更改为die
从每条\n
条消息中删除尾随换行符die
,因为它会隐藏行号信息。
$ftp->login( $ftpUser, $ftpPW )
or die "Could not login FTP :" . $ftp->message;
创建一个$SIG{__DIE__}
处理程序,将die
输出镜像到文件句柄。
local $SIG{__DIE__} = sub {
print L1 @_;
die @_;
};