Используя Perl, я хочу фильтровать файлы с именами, соответствующими определенному шаблону, используя SFTP. - PullRequest
0 голосов
/ 20 сентября 2018

Я попробовал приведенный ниже фрагмент, но он всегда получает имя всех файлов, присутствующих в текущем каталоге.

my %args = ("user" => $user, "password" => $pass, "warn" => 0 );

$con= Net::SFTP->new($server, %args);

@files = $con->ls($dir, wanted =>"*.csv");

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Похоже, что для метода ls опция wanted отсутствует.Тем не менее, вы можете передать обратный вызов.Вот пример использования Text::Glob и функции обратного вызова wanted():

use strict;
use warnings;
use Net::SFTP;
use Text::Glob qw( match_glob );

my $con= Net::SFTP->new('host', user => 'user', password => 'pass');
my $dir = '.';  # specify the directory

my @files;    # store filenames here
$con->ls($dir, sub { wanted( $_[0], '*.csv') } );

say for @files;  # print the matched filenames

sub wanted {
    my ( $info, $pat ) = @_;

    my $filename = $info->{filename};

    if (match_glob( $pat, $filename ) ) {
        push @files, $filename;
    }
}
0 голосов
/ 20 сентября 2018

Вы можете сделать это таким образом в модуле Net :: SFTP :: Foreign.Я считаю, что то же самое должно работать для Net :: SFTP.

my @files = map {$_->{'filename'}} grep {$_->{'filename'} =~ /.csv$/i} @{$con->ls("$dir")};
...