perl使用通配符在ftp-> ls中引用

cmo*_*cmo 0 ftp quotes perl ls wildcard

远程目录的内容 mydir:

blah.myname.1.txt
blah.myname.somethingelse.txt
blah.myname.randomcharacters.txt
blah.notmyname.1.txt
blah.notmyname.2.txt
...
Run Code Online (Sandbox Code Playgroud)

在perl中,我想下载所有这些东西 myname

通过适当的引用我真的很难.请帮忙.

代码失败

my @files;
@files = $ftp->ls( '*.myname.*.txt' );  # finds nothing
@files = $ftp->ls( '.*.myname.*.txt' );  # finds nothing
Run Code Online (Sandbox Code Playgroud)

等等..

如何将通配符放入,以便ls由perl解释?这里出了什么问题?

amo*_*mon 6

我会假设您正在使用该Net::FTP软件包.然后这部分文档很有趣:

ls ( [ DIR ] )

获取DIR或当前目录的目录列表.

在数组上下文中,返回从服务器返回的行列表.在标量上下文中,返回对列表的引用.

这意味着如果您在没有参数的情况下调用此方法,则会获得当前目录所有文件列表,否则将从指定的目录中获取.

没有关于任何模式的消息,这并不令人惊讶:FTP只是一个传输文件的协议,而这个模块只是该协议的包装器.

您可以使用grep以下方法轻松完成过滤:

my @interesting = grep /pattern/, $ftp->ls();
Run Code Online (Sandbox Code Playgroud)

要选择包含字符序列的所有文件myname,请使用grep /myname/, LIST.
要选择包含字符序列的所有文件.myname.,请使用grep /\.myname\./, LIST.
要选择以字符序列结尾的所有文件.txt,请使用grep /\.txt$/, LIST.

LIST$ftp->ls或另一个grep,因此您可以轻松地链接多个过滤步骤.

当然,Perl Regexes比这更强大,我们可以/\.myname\.[^.]+\.txt$/根据您的具体要求在单个或类似的东西中进行所有过滤.如果你迫切需要一个全局语法,可以使用工具将glob模式转换为regex对象,Text::Glob甚至可以直接进行全局匹配:

use Text::Glob qw(match_glob);

my @interesting = match_glob ".*.myname.*.txt", $ftp->ls;
Run Code Online (Sandbox Code Playgroud)

然而,这是不雅,至少可以说,作为正则表达式是更强大,绝对值得我们学习.