0

远程目录的内容 mydir

blah.myname.1.txt
blah.myname.somethingelse.txt
blah.myname.randomcharacters.txt
blah.notmyname.1.txt
blah.notmyname.2.txt
...

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

我在适当的引用方面真的很失败。请帮忙。

失败的代码

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

ETC..

如何放置通配符以便它们由 解释ls,而不是由 perl 解释?这里出了什么问题?

4

1 回答 1

6

我将假设您正在使用该Net::FTP软件包。那么这部分文档很有趣:

ls ( [ DIR ] )

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

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

这意味着如果您不带参数调用此方法,您将获得当前目录中所有文件的列表,否则从指定目录中获得。

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

您可以使用以下方法轻松进行过滤grep

my @interesting = grep /pattern/, $ftp->ls();

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

是grepLIST$ftp->ls另一个 grep,因此您可以轻松链接多个过滤步骤。

当然,Perl 正则表达式比这更强大,我们可以/\.myname\.[^.]+\.txt$/根据您的具体要求在一个或其他东西中完成所有过滤。如果您迫切需要一种通配符语法,可以使用一些工具将 glob 模式转换为正则表达式对象,例如Text::Glob,甚至可以直接进行 glob 匹配:

use Text::Glob qw(match_glob);

my @interesting = match_glob ".*.myname.*.txt", $ftp->ls;

然而,至少可以这么说,这是不优雅的,因为正则表达式强大,绝对值得学习。

于 2012-12-07T16:45:46.343 回答