有两种形式的Perl文件名通配符命令的: <>
和glob
。 但是我发现有这两种形式的作用区别:
我想检索所有具有类似名称的文件,使用下面的代码:
my @files = <"rawdata/*_${term}_*.csv">; #(1)
和另一种格式:
my @files = glob "rawdata/*_${term}_*.csv"; #(2)
我希望使用这两个代码得到同样的结果。 但有区别:如果$term
不包含空格的字符串(或者说,一个字),然后(2)效果很好,但(1)不工作; 如果$term
是空格的字符串(或者说,几个单词),那么(1)效果很好,(2)不工作。
有这两个词语之间有何区别? 非常感谢。
<SomeStuff>
相当于glob "SomeStuff"
(除了所有与模糊度<>
也被用于从文件中读取句柄-见perldoc perlop
并查找I/O Operators
那里)。 因此你的例子是不等价的。 您应该使用
my @files = glob "\"rawdata/*_${term}_*.csv\""; #(2)
代替。
然而,至于为什么在模式空间有差别: perldoc -f glob
讲述的故事。 正常glob
(并且因此<>
其通过实现glob
)治疗空格作为图案隔板。 该文件还提到File::Glob
,它的功能bsd_glob
不把空格当作分隔模式。 因此考虑使用这个:
use File::Glob ':glob';
my $term1 = "some stuff";
my @files1 = glob "dir/${term1}*";
my $term2 = "more";
my @files2 = glob "dir/${term2}*";
print join(' :: ', sort @files1), "\n", join(' :: ', sort @files2), "\n";
与我刚刚创建一些文件可能的输出:
[0 mosu@tionne ~/tmp] ~/test/test1.pl
dir/some stuff is betther than other stuff.doc :: dir/some stuffy teachers.txt
dir/more beer.txt :: dir/more_is_less.csv
这里的区别在于使用引号。 从文档:
需要注意的是水珠按空白进行分割它的参数和对待每段作为单独的模式。
使用尖括号<>不需要引号。 水珠需要加引号。 因此,以下是等效的:
my @files = <rawdata/*_${term}_*.csv>;
my @files = glob "rawdata/*_${term}_*.csv";
如果$ {}一词包含了空间,它们都将分割的格局。 当你介绍引号到<>的形式,它可以防止这种分裂的情况发生在$ {术语}的带空格,从而搜索一个不同的模式。