2

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

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

我想使用一个常量来“文件”,比如说

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

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

先感谢您。

4

3 回答 3

6

嗯,这是使用Readonly而不是常量的原因之一。您可以使用常量&的开头或()结尾来让 Perl 意识到它是子程序。让我检查一下。

不,但是您可以使用创建 arrayref 的经典技巧来取消引用:

#!/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/*>;
于 2009-05-06T20:37:52.480 回答
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
}
于 2009-05-06T23:02:24.850 回答
-1

在这种情况下,“/”肯定会被视为除法,而且不太可能去任何地方。我认为您可能需要退后一步,看看您还有哪些其他选择。我认为您正在尝试进行“文件通配”,尽管我不记得细节,但我似乎记得 perl 对此的支持。CPAN 中有一个“Glob”模块,您可能想查看它。就我个人而言,我会更加行人,只需使用 DirHandle 并使用“下一个 ... 除非 ...”行过滤掉非 xml 文件。

于 2009-05-06T20:27:08.903 回答