我可以在glob运算符中使用Perl常量吗?

时间:2009-05-06 20:13:22

标签: perl constants glob

我正在解析XML文件,例如:

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

我想对'文件'使用常量,比如说

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

我希望你理解这个想法,并且可以帮助我:)。

提前谢谢。

3 个答案:

答案 0 :(得分: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/*>;

答案 1 :(得分:0)

正如其他人所说,这完全是关于字符串插值的。

常量pragma在插值上下文中失败,所以你必须使用能够工作的东西。

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

您也可以使用旧的“将只读值分配给typeglob技巧”。

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
}

答案 2 :(得分:-1)

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