【发布时间】:2009-05-06 20:13:21
【问题描述】:
我正在解析 XML 文件,例如:
while (<files/*.xml>) { ... }
我想对“文件”使用一个常量,比如说
use constant FILES_PATH => 'files';
while (<FILES_PATH/*.xml>) { ... }
我希望你理解这个想法,并能帮助我:)..
提前谢谢你。
【问题讨论】:
我正在解析 XML 文件,例如:
while (<files/*.xml>) { ... }
我想对“文件”使用一个常量,比如说
use constant FILES_PATH => 'files';
while (<FILES_PATH/*.xml>) { ... }
我希望你理解这个想法,并能帮助我:)..
提前谢谢你。
【问题讨论】:
嗯,这是使用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/*>;
【讨论】:
正如其他人所说,这都是关于字符串插值的。
常量 pragma 在插值上下文中失败,因此您必须使用可行的方法。
如前所述,只读是一种选择。
您还可以使用旧的“将只读值分配给 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
}
【讨论】:
在这种情况下,“/”肯定会被视为除法,而且不太可能去任何地方。我认为您可能需要退后一步,看看您还有哪些其他选择。我认为您正在尝试进行“文件通配”,尽管我不记得细节,但我似乎记得 perl 对此的支持。 CPAN 中有一个“Glob”模块,您可能想查看它。就个人而言,我会更加行人,只需使用 DirHandle 并使用“下一个 ... 除非 ...”行过滤掉非 xml 文件。
【讨论】: