为什么我不能在Perl的菱形运算符中使用typeglob?

时间:2015-01-29 07:16:13

标签: perl

通常bareword作为filehanle或变量保存文件句柄可以放在<>运算符中以引用文件,但是 NOT 从typeglob中提取的文件句柄如下面的最后一行所示。为什么它不起作用,因为最后一个案例也引用了文件句柄?

open FILE, 'file.txt';
my $myfile = *FILE{IO};
print <$myfile>;
print <*FILE{IO}>; # this line doesn't work.

2 个答案:

答案 0 :(得分:6)

<>readline()的快捷方式之一,它接受简单的标量或单词,即。 <FILE>。对于更复杂的表达式,您必须更明确,

print readline *FILE{IO};

否则将被解释为glob()

perl -MO=Deparse -e 'print <*FILE{IO}>;'

use File::Glob ();
print glob('*FILE{IO}');

答案 1 :(得分:3)

perlop中,它说:

  

如果尖括号内的内容既不是文件句柄也不是文件句柄   包含文件句柄名称,typeglob或的简单标量变量   typeglob引用,它被解释为文件名模式   全球...

因为我们希望能够说出这样的话:

foreach (<*.c>) {
  # Do something for each file that matches *.c
}

perl不可能将'*'解释为typeglob。

如另一个答案中所述,您可以使用readline解决此问题,或者您可以先将typeglob指定给标量(如您的示例所示)。