2016-07-22 2 views
2

Я пытаюсь открыть входной файл в качестве аргумента, используя Getopt Long модульPerl Getopt :: Длинный путь к файлу

:: Это начало моего сценария

#! /usr/bin/perl -s 
use strict; 
use warnings; 

use Data::Dumper; 
local $Data::Dumper::Useqq = 1; 
use Getopt::Long qw(GetOptions);; 

my $input=''; 

GetOptions('input|in=s' => \$input); 

open(my $table1,'<', $input) or die "$! - [$input]"; #input file 

И это как я запустить скрипт

$ script.pl -in /path/to/file.txt 

я получаю в качестве вывода:

Нет такого файла или каталога - [] в строке script.pl 13.

Строка 13 - это линия с open(....

Есть ошибки в скрипте?

ответ

3

Вы используете встроенную опцию Perl в разборе с -s в вашей притон линии. В команде, как script.pl -in /path/to/file.txt, что делает Perl установить переменную $in 1 и удалить соответствующую запись из @ARGV, прежде чем Getopt::Long когда-нибудь увидит, что

Просто удалите -s из притон линии и все, что он будет работать для вас

+0

Да! Но я думаю, что это комбинация этого, плюс мой ответ. – simbabque

+0

@simbabque: Нет. Без '-s'' Getopt :: Long' отлично работает, добавляете ли вы параметры до или после имени входного файла – Borodin

+0

Имя входного файла является одним из вариантов здесь. Я что-то не понимаю? – simbabque

1

No, в скрипте нет ошибки. Ваш код делает то, что вы ему сказали.

Это номер die "$! - [$input]"; этой линии, потому что open вернул значение false.

Нет такого файла или каталога является содержанием $!. Это ошибка, с которой она столкнулась. И между [] есть значение $input, которое пусто. Так что есть твоя проблема. Вы передаете пустую строку в open, и это не удается.

Вы называете это неправильным способом.

Getopt :: Long требует, чтобы опции, длина которых больше одной буквы, были префиксом --. Это означает, что -in должен быть --in.

$ script.pl --in /path/to/file.txt 

Поскольку вы этого не сделали, Getopt :: Long не видел ваш вариант и не разбирал его. Немного выше вы инициализировали $input = '', поэтому он остался пустой строкой.

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

use strict; 
use warnings; 
use Getopt::Long qw(GetOptions);; 

my $input = ''; 

GetOptions('input|in=s' => \$input); 

die 'the --input option is required!' unless $input; 

open(my $table1,'<', $input) or die "$! - [$input]"; #input file 
+0

* "Getopt :: Длинные потребности - в начале опций "* Только если вы поместите' -s' в строку команды (shebang)! – Borodin

+0

@borodin Hu? Документы этого не говорят. Там вообще не упоминается «-s». Только пример, который использует опцию '-s' для отображения пробелов в параметрах. – simbabque

+0

Это потому, что '--' служит только для переключения * off * Встроенная обработка параметров Perl.Без него опция анализируется и удаляется из '@ ARGV', поэтому' Getopt :: Long' даже не видит ее. Таким образом, вы можете использовать '-s ... --' или вообще не использовать' -s'. – Borodin

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