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解释?这里出了什么问题?
我会假设您正在使用该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)
然而,这是不雅,至少可以说,作为正则表达式是远更强大,绝对值得我们学习.