【问题标题】:Difference between two forms of Perl filename wildcard commandPerl 文件名通配符命令两种形式的区别
【发布时间】:2012-08-24 19:50:11
【问题描述】:

Perl 文件名通配符命令有两种形式:<>glob。但是我发现这两种形式的效果是有区别的:

我想检索所有具有相似名称的文件,使用以下代码:

my @files = <"rawdata/*_${term}_*.csv">;   #(1)

还有另一种格式:

my @files = glob "rawdata/*_${term}_*.csv";  #(2)

我希望使用这两个代码得到相同的结果。但是有区别:如果$term是一个没有空格的字符串(或者说是一个单词),那么(2)可以正常工作,但是(1)不行;如果$term 是一个带空格的字符串(或者说是几个单词),那么(1)可以正常工作,(2)不能正常工作。

这两种表达方式有什么区别吗? 非常感谢。

【问题讨论】:

标签: perl wildcard


【解决方案1】:

&lt;SomeStuff&gt; 等价于glob "SomeStuff"(除了&lt;&gt; 也用于从文件句柄读取的所有歧义——请参阅perldoc perlop 并在那里查找I/O Operators)。因此,您的示例不等效。你应该使用

my @files = glob "\"rawdata/*_${term}_*.csv\"";  #(2)

改为。

但是,至于为什么模式中的空格会有所不同:perldoc -f glob 讲述了这个故事。普通的glob(以及因此通过glob 实现的&lt;&gt;)将空格视为模式分隔符。该文档还提到了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

【讨论】:

    【解决方案2】:

    这里的区别在于引号的使用。来自文档:

    请注意,glob 将其参数拆分为空格并将每个段视为单独的模式。

    使用尖括号 不需要引号。 Glob 需要引号。因此,以下是等价的:

    my @files = <rawdata/*_${term}_*.csv>;
    my @files = glob "rawdata/*_${term}_*.csv";
    

    如果 ${term} 包含空格,它们都会拆分模式。当您在 表单中引入引号时,它可以防止在带有空格的 ${term} 上发生这种拆分,从而搜索不同的模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 2015-04-22
      • 2013-09-20
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多