我正在解析XML文件,例如:
while (<files/*.xml>) { ... }
我想对'文件'使用常量,比如说
use constant FILES_PATH => 'files';
while (<FILES_PATH/*.xml>) { ... }
我希望你理解这个想法,并且可以帮助我:)。
提前谢谢。
答案 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文件。