Невозможно вызвать метод "имя файла" без ссылки на пакет или объект - PullRequest
0 голосов
/ 09 ноября 2018

Я хочу загрузить с ftp-сервера (host1) несколько каталогов с контентом. Для этого я использую библиотеку Net :: FTP :: Recursive . Когда я запускаю код, папки и файлы были загружены. Тем не менее, я получил это сообщение:

>Can't call method "filename" without a package or object reference 
 at C:\10_LIB~1\PerlLib\lib\perl5/Net/FTP/Recursive.pm line 86.

Интересно, почему это происходит, какое влияние это имеет и как мне этого избежать.

Вот код для скачивания:

# -- Libraries

# coding and diagnostic
use strict;
use warnings;

# FTP connection
use Net::FTP;
use Net::FTP::Recursive;

# -- Settings

my $host1      = "ftp.host1.com";
my $user1      = "myname\@myweb.com";
my $password1  = "password";

# -- Connection to ftp server

my $f1 = Net::FTP::Recursive->new($host1) or die "Can't open \$f1 $host1\n";
$f1->login($user1, $password1) or die "Can't log \$f1 $user1 in\n";
$f1->cwd() or die "Can't cwd to host folder\n";

# $f1->ascii();
$f1->binary;

# -- Directory to download the contents

my $download = "C:/mydirectory/download";
chdir($download);

# -- Host1

$f1->cwd();
$f1->rget( ParseSub => \&yoursub1 );
$f1->quit;    

sub yoursub1 {
$f1->rget;
}

Я использовал Perl в Windows 7 с версией:

perl -v
This is perl 5, version 28, subversion 0 (v5.28.0) built for MSWin32-x64-multi-thread

А вот код из /Net/FTP/Recursive.pm до строки 86 сообщения:

sub _rget {
    my($ftp) = shift;

    my @dirs;

    my @ls = $ftp->dir();

    my @files = $options{ParseSub}->( @ls );

    @files = grep { $_->filename =~ $options{MatchAll} } @files
      if $options{MatchAll};

    @files = grep { $_->filename !~ $options{OmitAll} } @files
      if $options{OmitAll};

    print STDERR join("\n", @ls), "\n"
      if $ftp->debug;

    my $remote_pwd = $ftp->pwd;
    my $local_pwd = Cwd::cwd();

    FILE:
    foreach my $file (@files){
        #used to make sure that if we're deleting the files, we
        #successfully retrieved the file
        my $get_success = 1;
        my $filename = $file->filename();       # <- 86 

1 Ответ

0 голосов
/ 10 ноября 2018

yoursub1 совершенно неверно. Предполагается проанализировать строки, возвращенные с FTP-сервера (предоставленные в качестве аргументов для подпрограммы), и вернуть список объектов Net :: FTP :: Recursive :: File для каждого удаленного файла (кроме . и ..). ).

Если реализации по умолчанию (Net::FTP::Recursive::parse_files) достаточно, просто удалите ParseSub => \&yoursub1. В противном случае вам, вероятно, следует начать с копирования Net::FTP::Recursive::parse_files и настройки его для вывода вашего FTP-сервера.

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