perl - 两种形式的 Perl 文件名通配符命令之间的区别

标签 perl wildcard

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/

相关文章:

go - gorilla /处理程序的 CORS 预检神秘失败

java - 无法在泛型中实例化类型

powershell - Get-ChildItem 不适用于 Include

ssl - 如何在不同的服务器上添加带有子域的 SSL?

perl - 使用语句或函数作为值的键散列?

arrays - 按值对哈希值进行排序

perl - 反转哈希、获取其键并排序

c - 在 Windows 中,与 C 程序一起执行的 Perl 代码将错误的字节长度写入内存

perl - 如何在 Perl 中读取固定长度的记录?

python - 如何从结尾字符可以更改的文件夹中导入文件 - python pandas?