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]] = '文件名.txt';

我也试过不改变目录,只是做$ftp->ls('subdir/*.txt');同样的结果。

为什么要这样做?我误解了返回值?这是在 WINDOWS 上。

4

1 回答 1

0

首先,您应该使用

use Net::FTP;

代替

use Net::FTP::Common;

因为您使用 Net::FTP 而不是 Net::FTP::Common。

现在谈谈你的问题。


文档说:

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

这肯定意味着

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

您在标量上下文中调用它。你要

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 回答