【问题标题】:perl quoting in ftp->ls with wildcardperl 在 ftp->ls 中使用通配符引用
【发布时间】:2012-11-25 20:44:06
【问题描述】:

远程目录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

等等。

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

【问题讨论】:

  • 你确定 perl 的 ls 函数接受通配符吗? ftp 客户端自己进行文件过滤,而不是远程系统,因此通配符可能永远不会出现。您可能必须自己检索完整的目录列表并进行自己的匹配。
  • @MarcB 你是什么意思-“ftp 客户端自己进行文件过滤”?他们不处理通配符吗??
  • 确实有,但是你检查过 perl 的 ftp 库有没有?例如$ftp->ls('*')?如果它使用通配符,那只会返回所有内容。

标签: perl ftp wildcard quotes ls


【解决方案1】:

我假设您使用的是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

LIST$ftp->ls 或其他 grep,因此您可以轻松链接多个过滤步骤。

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

use Text::Glob qw(match_glob);

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

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

【讨论】:

  • 谢谢。我的主要问题是我试图让通配符在“ls”期间被解释。
猜你喜欢
  • 2013-11-26
  • 2019-06-17
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 2010-12-09
  • 1970-01-01
相关资源
最近更新 更多