2009-05-06 7 views

ответ

6

Хм, это одна из причин использования 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/*>; 
+0

Итак, у меня нет доступного модуля Readonly :(.. будет использовать только опцию glob. – grilix

+0

Readonly находится в CPAN, выполните поиск, как настроить CPAN на вашей ОС или, если вы используете Linux, посмотрите на пакеты доступны в вашем дистрибутиве (Readonly скорее всего был упакован для вас). В Ubuntu он называется libreadonly-perl –

-1

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

+0

Нет, содержимое <> рассматривается как строка с двойными кавычками, если она не является дескриптором файла, поэтому/не имеет специального значения. Вот почему вы не можете просто использовать константу (константы не интерполируются), но работает старый вызов разыменования-anonymous-array-to-include-a-function-call. opendir + readdir + grep + closedir - правильный ответ, но часто glob проще читать (особенно если вы используете Readonly вместо постоянной прагмы). –

0

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

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

Как уже упоминалось, Readonly является одним из вариантов.

Вы также можете использовать старый «назначить значение, доступное только для чтения» трюку типаglob ».

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 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^