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