Perl - использование неинициализированной переменной $ ftp - PullRequest
0 голосов
/ 28 апреля 2018

Я получаю сообщение об ошибке при запуске приведенного ниже сценария Perl. Ошибка гласит:

Использование неинициализированного значения в фильере на линии AfterGauss.pl 54.

Строка 54 - $ftp->put($fpath1) || die $ftp->message;. Есть ли что-то, что кто-то видит неправильно с моим кодом. Я попытался удалить операторы die, и первый ftp просто не удался. Если я повторно запускаю скрипт, он работает нормально во второй раз, но первый всегда выдает мне эту ошибку.

use strict;
use warnings;
use Net::FTP;


#proper date.ini file with fully qualified path
my $dateFile = "C:\\CompOps\\PostApps\\ini\\pDate.ini";

my $date;

#Get Date
open FILE, $dateFile || die "could not open $dateFile";
while(<FILE>) {
    $date = $_;
}
close FILE;

#Trim Date
$date =~ s/^\s+|\s+$//g;

#rdc original filename with path
my $fileName1 = "Y:\\PRODUCTS\\XML\\RDCX$date.XML";
#rdc new filename with path
my $newFileName1 = "Y:\\PRODUCTS\\XML\\rdcx$date.xml";
#rdc new filename with path to $archiveFile1
my $archiveFile1 = "Y:\\PRODUCTS\\XML\\Archive\\rdcx$date.xml";
#rom original filename with path
my $fileName2 = "W:\\BBSDATA\\ROMX$date.ZIP";
#rom new filename with path
my $newFileName2 = "W:\\BBSDATA\\romx$date.zip";

#rdc file with path to post from
my $fpath1 = $newFileName1;
#rom file with path to post from
my $fpath2 = $newFileName2;

#rename RDC file to lowercase
rename($fileName1, $newFileName1) || die "Cannot rename $fileName1: $!\n";

#rename ROM file to lowercase
rename($fileName2, $newFileName2) || die "Cannot rename $fileName2: $!\n";

# FTP credentials
my $host = "HOST";
my $user = "USERNAME";
my $pass = "PASSWORD";
#directory to post to
my $dir = "/content-inbound-to-rdc";

#ftp rdc file
my $ftp = Net::FTP->new($host) || die "Can't open $host: $@\n";
$ftp->login($user, $pass) || die $ftp->message;
$ftp->cwd($dir);
$ftp->put($fpath1) || die $ftp->message;
$ftp->quit;
print "rdc ftp successful! ";
print $ftp->message;

#move rdc file to $archive
rename($newFileName1, $archiveFile1) || die "Cannot move rdc file to archive \n";

#update credentials
$host = "HOST";
$user = "USERNAME";
$pass = "PASSWORD";
#update post to path
$dir = '/cedrom';
#ftp rdc file
$ftp = Net::FTP->new($host) || die "Can't open $host: $@\n";
$ftp->login($user, $pass) || die $ftp->message;
$ftp->cwd($dir);
$ftp->put($fpath2) || die $ftp->message;
$ftp->quit;
print "rom ftp successful! ";
print $ftp->message;

1 Ответ

0 голосов
/ 28 апреля 2018

Возможно, это вызвано какой-то проблемой в сети, например, разрыв соединения. Тогда $ftp->message может быть undef, поскольку сервер не может отправить здесь ни одного сообщения. Но это только предположение, в документации неясно, откуда на самом деле $ftp->message.

Явление, что это работает во второй попытке, может усилить эту гипотезу. Неисправное сетевое оборудование иногда «просыпается» после некоторого трафика, который изначально не удался.

Если вы хотите повторить попытку несколько раз, вот эскиз (не проверенный, но должен продемонстрировать идею):

print("put\n");
for (my $counter = 3; $counter; $counter--) {
  if (!$ftp->put($fpath1)) {
    if (defined($ftp->message)) {
      print("Error. Message: $ftp->message\n");
    }
    else {
      print("Error. Message: undef\n");
    }
    print("retrying...\n");
  }
  else {
    last;
  }
}
if (!$counter) {
  print("gave up.\n");
  # further error handling goes here... e.g. abort the script...
}

Вы можете удалить

    if (defined($ftp->message)) {
      ...
    }
    else {
      ...
    }

if (!$counter) {
  ...
}

и print() s, если вы не хотите обрабатывать это или иметь этот вывод соответственно.

Также при необходимости уменьшите или увеличьте начальное значение счетчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...