如何使用GetOpt添加-v开关而无需使用文件名开关?

时间:2013-05-29 19:42:04

标签: perl

我希望能够以两种方式之一运行我的脚本:

perl script.pl file  
perl script.pl -v file 

我知道怎么做

perl script.pl -v -f file 

但我想这样做而不需要-f for file。

3 个答案:

答案 0 :(得分:3)

使用GetOpt后,@ARGV中的其余项目是您的位置参数。您只需要使用$ARGV[0]作为“文件”。

use Getopt::Long;

my $verbose = 0;
my %opts = ( 'verbose' => \$verbose );
GetOptions(\%opts, 'verbose|v') or die "Incorrect options";
my $file = $ARGV[0];
die "You must provide a filename" unless length $file;

答案 1 :(得分:2)

您可以使用Getopt::Long's argument callback

use Getopt::Long;                                                                                                                                                                                          

my $file;                                                                                                                                                                                                  
GetOptions(                                                                                                                                                                                                
    'v' => \my $v,                                                                                                                                                                                         
    '<>' => sub { $file = shift },                                                                                                                                                                         
);                                                                                                                                                                                                         

print "\$v: $v\n";                                                                                                                                                                                         
print "\$file: $file\n"; 

命令perl script.pl -v foo.txt输出:

$v: 1
$file: foo.txt

答案 2 :(得分:0)

Getopt::Long解析(默认情况下)@ARGV中的项目,并在处理@ARGV时逐个删除这些项目。 Getoptions完成后,@ARGV中剩余的第一个项目将是文件名:

use warnings;
use strict;
use Getopt::Long;

my $verbose;

GetOptions (
    'v'  =>  "\$verbose",
) or die qq(Invalid arguments passed);

my $file = shift;  #Assuming a single file. Could be multiple
if ( $verbose ) {
    print "Do something verbosely\n";
}
else {
    print "Do it the normal way...\n";
}

不需要特别的东西。您允许GetOptions处理-v参数(如果存在),并允许@ARGV包含GetOptions完成执行后剩余的所有参数。

顺便说一下,你可以这样做:

GetOptions (
    'verbose'  =>  "\$verbose",
) or die qq(Invalid arguments passed);

你可以使用:

perl script.pl -v file 

或     perl script.pl -verbose文件

perl script.pl -verb file

因为默认情况下,GetOptionsauto_abbreviate参数并找出用户尝试传递的参数。

我强烈建议您查看documentation并稍微玩一下。会有很多对你来说没有意义的东西,但这可能是新Perl程序员开始使用的最早的模块之一,而且它充满了各种各样的东西。

随着技能的发展,继续回头重新阅读文档,因为随着您对Perl的理解的增加,您将在此模块中找到新内容。