Perl文件名通配符命令有两种形式:<>
和glob
。但我发现这两种形式的效果有区别:
我想使用以下代码检索具有相似名称的所有文件:
my @files = <"rawdata/*_${term}_*.csv">; #(1)
和另一种格式:
my @files = glob "rawdata/*_${term}_*.csv"; #(2)
我希望使用这两个代码获得相同的结果。但是有区别:如果$term
是一个没有空格的字符串(或者说一个字),那么(2)效果很好,但是(1)不起作用;如果$term
是一个带空格的字符串(或者说几个单词),那么(1)效果很好,(2)不起作用。
这两个表达式之间有什么区别吗? 非常感谢。
答案 0 :(得分:4)
这里的区别在于使用引号。来自文档:
请注意,glob将其参数拆分为空格,并将每个段视为单独的模式。
使用有角度的括号&lt;&gt;不需要引号。 Glob需要报价。因此,以下内容是等效的:
my @files = <rawdata/*_${term}_*.csv>;
my @files = glob "rawdata/*_${term}_*.csv";
如果$ {term}包含空格,他们将分割模式。当您向&lt;&gt;引入引号时形式,它可以防止这种分裂发生在带有空格的$ {term}上,从而搜索不同的模式。
答案 1 :(得分:4)
<SomeStuff>
相当于glob "SomeStuff"
(除了<>
也用于从文件句柄中读取的所有歧义之外 - 请参阅perldoc perlop
并查找{{1} }} 那里)。因此,您的示例并不等同。你应该使用
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";