我的测试脚本:
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:\>
答案 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
,但是opendir
和readdir
可以使用
喜欢这个
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上没有(空列表),而没有qq
。 glob
关于引用和空格的这种不一致行为是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的标量变量 引用,它被解释为一个全局文件名模式,和 要么返回文件名列表,要么返回列表中的下一个文件名, 视情况而定。
...
首先完成一级双引号解释......
[不再提及插值。]