2016-07-22 57 views
2

我试图打开输入文件使用的Getopt参数::龙模块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 

我得到的输出:

没有这样的文件或目录 - [] at script.pl第13行。

第13行是open(...

脚本中是否有错误?

回答

3

您正在使用Perl的内置选项解析您的shebang行中的-s。在像script.pl -in /path/to/file.txt命令,使perl的变量$in设置为1,Getopt::Long之前从@ARGV相应的条目曾经看到它

刚从家当线去除-s和一切它会为你

+0

是的!但我认为这是这个结合,加上我的答案。 – simbabque

+0

@simbabque:没有。如果没有'-s'' Getopt :: Long',你可以在输入文件名之前或之后输入选项 – Borodin

+0

输入文件名是这里的选项之一。我误解了什么吗? – simbabque

1

没有,脚本没有错误。你的代码正在做你告诉它做的事情。

它调用该行的die "$! - [$input]";部分,因为open返回了虚假值。

没有这样的文件或目录$!的内容。这是它遇到的错误。并且在[]之间有$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

这是因为'--'只用于关闭* Perl的内置选项处理。没有它,一个选项被解析并从'@ ARGV'中移除,因此'Getopt :: Long'甚至都没有看到它。所以你可以使用'-s ... --'或者不使用'-s'。 – Borodin