我解析XML文件的东西,如:我可以在glob运算符中使用Perl常量吗?
while (<files/*.xml>) { ... }
我想用一个常数“文件”,说
use constant FILES_PATH => 'files';
while (<FILES_PATH/*.xml>) { ... }
我希望你明白的想法,并能帮助我: )..
在此先感谢您。
我解析XML文件的东西,如:我可以在glob运算符中使用Perl常量吗?
while (<files/*.xml>) { ... }
我想用一个常数“文件”,说
use constant FILES_PATH => 'files';
while (<FILES_PATH/*.xml>) { ... }
我希望你明白的想法,并能帮助我: )..
在此先感谢您。
嗯,这是使用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/*>;
当然,在这种情况下,“/”将被视为分割,并且不可能去任何地方。我想你可能需要退后一步,看看你有什么其他选择。我认为你正在尝试“文件通配”,我似乎回想起perl中的支持,尽管我不记得细节。 CPAN中有一个“Glob”模块,您可能需要查看。就我个人而言,我会更行人,只是使用DirHandle并用“next ...除非...”行过滤掉非xml文件。
不,如果不是文件句柄,<>的内容被视为双引号字符串,所以/没有特殊含义。这也是为什么你不能只使用常量(常量不能插值),而是旧的解引用 - 匿名数组 - 包含函数调用。 opendir + readdir + grep + closedir是一个有效的答案,但通常glob更容易阅读(特别是如果您使用Readonly而不是常量编译指示)。 – 2009-05-06 20:50:54
正如其他人所说,这是关于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
}
如此完整,但我没有Readonly模块可用:(..将使用glob选项 – grilix 2009-05-07 12:29:11