2016-09-08 4 views
-1

Я исполняющего мой сценарий так:Perl открыть файл из командной строки с помощью шаблона

./script.pl -f files* 

Я смотрел на некоторых других потоков (например, How can I open a file in Perl using a wildcard in the directory name?)

Если я жесткий код имя файла, как он есть написанный в этой теме, я получаю желаемый результат. Если я беру его из командной строки, это не так.

Моя подпрограмма должна сохранять все файлы, которые я получаю в массиве.

my @file; 
sub Options{ 
    my $i=0; 
    foreach my $opt (@ARGV){ 
    switch ($opt){ 
     case "-f" { 
     $i++; 

     ### This part does not work: 
     @file= glob $ARGV[$i]; 
     print Dumper("$ARGV[$i]"); #$VAR1 = 'files'; 
     print Dumper(@file); #$VAR1 = 'files'; 
     } 
    } 
    $i++; 
    } 
} 

Кажется, что выполнение интерпретируется заранее, и шаблон шаблона (*) отбрасывается в процессе.

0 Желаемый результат: Все файлы, начинающиеся с , хранятся в массиве, после выполнения команды из командной строки.

Надеюсь, вы получите мою проблему. Если не стесняйтесь спрашивать.

спасибо.

ответ

2

Ну, сначала я бы предложил использовать модуль для выполнения args в командной строке: Getopt::Long например.

Но в противном случае ваша проблема проще - ваш shell расширяет «файл», прежде чем он получит его. (оболочка glob добирается туда первым).

Если вы делаете это с:

-f 'file*' 

, то он будет работать должным образом. Вы должны быть в состоянии увидеть это - например - если вы просто:

use Data::Dumper; 
print Dumper \@ARGV; 

Я ожидаю, что вы будете видеть гораздо более длинный список, чем вы думали.

Однако я бы также отметил, что у perl есть действительно хорошая функция, которую вы можете использовать (в зависимости от того, что вы делаете с вашими файлами).

Вы можете использовать <>, который автоматически открывает и считывает все файлы, указанные в командной строке (в порядке).

+0

lol, это было довольно просто. Но есть ли способ сделать это без "или" Таким образом, можно автоматически заполнить имена файлов с помощью табуляции? – Ueffes

+0

Да - проблема в том, что в этом случае оболочка расширяет шаблон. Не давайте ему «шаблон оболочки», (Например, если вы заполните вкладку), и все будет хорошо. – Sobrique

+0

meh ok. Спасибо, хотя =) – Ueffes

0

Поскольку ваша оболочка уже расширяет glob files* в список имен файлов, это то, что получает программа Perl.

$ perl -E 'say @ARGV' files* 
files1files2files3 

Не нужно делать это на Perl, если ваша оболочка может сделать это за вас. Если все, что вы хотите, это имена файлов в массиве, у вас уже есть @ARGV, который содержит их.

+0

ну, мне нужно сделать кое-что с этими файлами, и мне нужно дать пользователю такие опции, как -f, -h , и т.д. – Ueffes

+0

Затем вы должны использовать модуль для обработки аргументов командной строки, например [Sobrique said] (http://stackoverflow.com/a/39391405/1331451), например. Getopt :: Long. После этого вы можете использовать список имен файлов. – simbabque

+0

хорошо, хотя я ценю совет, мой вопрос был не в том, как я проверяю параметры, но как я получаю файлы из командной строки. – Ueffes

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