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

等..

lsperl ではなく によって解釈されるようにワイルドカードを配置するにはどうすればよいですか? ここで何がうまくいかないのですか?

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

LISTは、または別の grepのいずれかである$ftp->lsため、複数のフィルタリング手順を簡単に連鎖させることができます。

もちろん、Perl 正規表現はそれよりも強力であり、正確な要件/\.myname\.[^.]+\.txt$/に応じて、単一または何かですべてのフィルタリングを実行できます。グロビング構文がどうしても必要な場合は、グロブ パターンを などの正規表現オブジェクトに変換したり、直接グロブ マッチングを行うツールがあります。Text::Glob

use Text::Glob qw(match_glob);

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

ただし、正規表現ははるかに強力であり、学ぶ価値があるため、控えめに言っても、それは洗練されていません。

于 2012-12-07T16:45:46.343 に答える