如何使用Perl glob读取远程位置?

时间:2016-03-14 22:33:36

标签: perl glob

我的测试脚本:

my $loc = "\\\\ant\\d1_sp\\test__18716093";
####$loc = "c:\\temp"; #this works good if I un-comment.
system("dir $loc\\*.log"); #added system command just for debugging.
my @test = glob qq("$loc\\*.log");
print "\narray=@test\n";

我想将 $ loc 中的文件名保存到数组中以便进一步处理,但它没有这样做,我错过了什么?输出是:

C:\>perl c:\temp\foo.pl

Directory of \\ant\d1_sp\test__18716093

03/14/2016  01:09 PM               959 build_1.8980.log
03/14/2016  01:20 PM           102,402 build_2.98981.log
           2 File(s)        103,361 bytes
           0 Dir(s)  1,589,522,239,488 bytes free

array=
C:\>

3 个答案:

答案 0 :(得分:4)

您想列出以下共享中的.log个文件:

\\ant\d1_sp\test__18716093

为此,您需要使用以下glob模式:

\\\\ant\\d1_sp\\test__18716093\\*.log

以下是生成该字符串的字符串文字:

"\\\\\\\\ant\\\\d1_sp\\\\test__18716093\\\\*.log"

所以解决方案是

glob("\\\\\\\\ant\\\\d1_sp\\\\test__18716093\\\\*.log")

最好只使用/代替\,因为您不需要以glob模式或字符串文字来转义它。

glob("//ant/d1_sp/test__18716093/*.log")

答案 1 :(得分:0)

我确定您无法在网络驱动器上使用glob,但是opendirreaddir可以使用

喜欢这个

my $loc = '\\\\ant\d1_sp\test__18716093';

my @test = do {
    opendir my ($dh), $loc or die $!;
    map "$loc\\$_", grep /\.log$/i, readdir $dh;
};

答案 2 :(得分:0)

首先,qq提供glob可能会或可能不会按预期处理的额外引用。

这会正确列出.pl中的所有$loc个文件,即单个目录或'{dir1,dir2,...}'

my @files = glob "$loc/*.pl";

使用额外的qq,我会在v5.10上获得空列表。

以下是ThisSuitIsBlackNot在评论中提出的额外qq的示例,已复制

mkdir foo && touch foo/{bar,baz,qux}.pl;
perl -E '$loc = "foo"; say for glob qq{"$loc/*.pl"}'
# prints `foo/bar.pl, foo/baz.pl, and foo/qux.pl`.

这在v5.16上按预期工作,但在v5.10上没有(空列表),而没有qqglob关于引用和空格的这种不一致行为是fixed in v5.16

如路径中有空格,需要额外的引用级别,如Borodin所述,并在评论中由ThisSuitIsNotBlack解释,此处进行了总结。 对于带有空格的$path,需要

$loc = q("$path"); glob("$loc/*");  
$loc = "$path";    glob(qq{"$loc/*"});

我更喜欢的另一个选择是使用Path::Class

来自perldoc -f glob

  

这是实现<*.c>运算符的内部函数,但您可以直接使用它。如果省略EXPR,则使用$_<*.c>运算符将在&#34; I / O运算符&#34;中进行更详细的讨论。在perlop。

来自perldoc perlop,同时谈论<..>

  

如果尖括号内的内容既不是文件句柄也不是简单文件       包含文件句柄名称,typeglob或typeglob的标量变量       引用,它被解释为一个全局文件名模式,和       要么返回文件名列表,要么返回列表中的下一个文件名,       视情况而定。

     

...

     

首先完成一级双引号解释......

[不再提及插值。]