2009-05-06 72 views
2

我解析XML文件的东西,如:我可以在glob运算符中使用Perl常量吗?

while (<files/*.xml>) { ... } 

我想用一个常数“文件”,说

use constant FILES_PATH => 'files'; 
while (<FILES_PATH/*.xml>) { ... } 

我希望你明白的想法,并能帮助我: )..

在此先感谢您。

回答

6

嗯,这是使用Readonly而不是常数的一个原因。您可以在常量的末尾使用&开头或()以使Perl知道它是子程序。让我检查一下。

没有,但是你可以使用创建数组引用取消引用的经典绝招:

#!/usr/bin/perl 

use strict; 
use warnings; 

use constant DIR => "/tmp"; 

print map { "$_\n" } <${[DIR]}[0]/*>; 

但由于glob "*"相同<*>你可能喜欢:

#!/usr/bin/perl 

use strict; 
use warnings; 

use constant DIR => "/tmp"; 

print map { "$_\n" } glob DIR . "/*"; 

我可能会说

#!/usr/bin/perl 

use strict; 
use warnings; 

use Readonly; 

Readonly my $DIR => "/tmp"; 

print map { "$_\n" } <$DIR/*>; 
+0

如此完整,但我没有Readonly模块可用:(..将使用glob选项 – grilix 2009-05-07 12:29:11

-1

当然,在这种情况下,“/”将被视为分割,并且不可能去任何地方。我想你可能需要退后一步,看看你有什么其他选择。我认为你正在尝试“文件通配”,我似乎回想起perl中的支持,尽管我不记得细节。 CPAN中有一个“Glob”模块,您可能需要查看。就我个人而言,我会更行人,只是使用DirHandle并用“next ...除非...”行过滤掉非xml文件。

+0

不,如果不是文件句柄,<>的内容被视为双引号字符串,所以/没有特殊含义。这也是为什么你不能只使用常量(常量不能插值),而是旧的解引用 - 匿名数组 - 包含函数调用。 opendir + readdir + grep + closedir是一个有效的答案,但通常glob更容易阅读(特别是如果您使用Readonly而不是常量编译指示)。 – 2009-05-06 20:50:54

0

正如其他人所说,这是关于stri插值。

常量编译指示在内插上下文中失败,所以你必须使用一些可行的东西。

如前所述,Readonly是一种选择。

您还可以使用旧的“为类型球技巧分配只读值”。

our $FILES_PATH; # declare FILES_PATH scalar to keep strict happy. 
*FILES_PATH = \'files'; # Assign to typeglob so $FILES_PATH points to a string literal 

while(<$FILES_PATH/*.xml>) { 
    # read the files 
} 
相关问题