0

LSコマンドは、Net::FTPで期待するものを提供していません。文字列(ファイル名)の配列を返すことを期待していましたが、文字列の配列を含む配列を取得しました。

use strict;
use Net::FTP::Common;

my ($host, $user, $pw) = ('<ftp site>', 'user', 'pw');
my $ftp = new Net::FTP($host) || die;
$ftp->login($user, $pw) || die;

my $pwd = $ftp->pwd();
my $subDir = 'subdir/';
my $pattern = '*.txt';
$ftp->cwd($subDir); 

$ftp->pasv(); # passive mode
my @files = $ftp->ls($pattern) || die;

$ftp->cwd($pwd); 

ファイル配列は次のようになります。次に例を示します。

@files [@array [0]] ='filename.txt';

また、ディレクトリを変更せず$ftp->ls('subdir/*.txt');、同じ結果で実行し​​ようとしました。

なぜこれをしているのですか?戻り値を誤解していますか?これはWINDOWSにあります。

4

1 に答える 1

0

まず、使用する必要があります

use Net::FTP;

それ以外の

use Net::FTP::Common;

Net :: FTP::CommonではなくNet::FTPを使用しているためです。

さて、あなたの問題に移りましょう。


ドキュメントには次のように書かれています。

配列コンテキストでは、サーバーから返された行のリストを返します。スカラーコンテキストでは、リストへの参照を返します。

これは確かに意味します

リストコンテキストでは、サーバーから返された行のリストを返します。スカラーコンテキストでは、これらの行の配列への参照を返します。

あなたはそれをスカラーコンテキストで呼んでいます。あなたが欲しい

my $files = $ftp->ls($pattern)
   or die;  # || would work, just not idiomatic.

for my $file (@$files) {
   ...
}

リストコンテキストで呼び出すとls、エラーチェックが犠牲になります。

# No way to determine whether empty means error or no files.
my @files = $ftp->ls($pattern);

for my $file (@files) {
   ...
}
于 2012-10-04T22:43:31.003 に答える