Могу ли я использовать константу Perl в операторе glob?

StackOverflow https://stackoverflow.com/questions/831517

  •  06-07-2019
  •  | 
  •  

Вопрос

Я анализирую 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; линия.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top