Могу ли я использовать константу Perl в операторе glob? - PullRequest
2 голосов
/ 07 мая 2009

Я анализирую XML-файлы с чем-то вроде:

while (<files/*.xml>) { ... }

Я хочу использовать константу для «файлов», скажем

use constant FILES_PATH => 'files';
while (<FILES_PATH/*.xml>) { ... }

Надеюсь, вы понимаете идею и можете мне помочь:) ..

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 07 мая 2009

Хм, это одна из причин использовать Readonly вместо константы. Вы можете использовать & start или () в конце константы, чтобы 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/*>;
0 голосов
/ 07 мая 2009

Как уже говорили другие, это все о интерполяции строк.

Постоянная прагма терпит неудачу в интерполяционных контекстах, поэтому вы должны использовать что-то, что будет работать.

Как уже упоминалось, 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
}
0 голосов
/ 07 мая 2009

Конечно, "/" в этом контексте будет рассматриваться как разделение, и это вряд ли пойдет никуда. Я думаю, что вам, возможно, придется сделать шаг назад и посмотреть, какие у вас есть варианты. Я думаю, что вы пытаетесь сделать "файловое копирование", и я, кажется, вспоминаю поддержку в Perl для этого, хотя я не вспоминаю детали. В CPAN есть модуль Glob, который вы можете посмотреть. Лично я был бы намного более пешеходным и просто использовал бы DirHandle и отфильтровал не-XML-файлы с помощью строки «следующий ... если ...».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...