Могу ли я использовать константу Perl в операторе glob?
Вопрос
Я анализирую 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/*>;
Другие советы
Как уже говорили, все дело в интерполяции строк.
Постоянная прагма терпит неудачу в интерполяционных контекстах, поэтому вы должны использовать то, что будет работать.
Как уже упоминалось, 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
}
Конечно, " / " в этом контексте будет рассматриваться как разделение, и это вряд ли пойдет никуда. Я думаю, что вам, возможно, придется сделать шаг назад и посмотреть, какие у вас есть варианты. Я думаю, что вы пытаетесь сделать & Quot; file globbing & Quot; и я, кажется, вспоминаю поддержку в Perl для этого, хотя я не помню детали. Существует & Quot; Glob & Quot; модуль в CPAN, который вы можете посмотреть. Лично я был бы намного более пешеходным и просто использовал бы DirHandle и отфильтровал не-XML-файлы с помощью & Quot; next ..., если ... & Quot; линия.