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
关于perl - 两种形式的 Perl 文件名通配符命令之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12115772/