0

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

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

我知道该怎么做

perl script.pl -v -f file 

但我想在不需要 -f 文件的情况下做到这一点。

4

3 回答 3

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;
于 2013-05-29T19:48:23.987 回答
2

您可以使用Getopt::Long 的参数回调

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
于 2013-05-29T19:55:04.810 回答
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

因为,默认情况下,GetOptions自动缩写参数并找出用户试图传递的参数。

我强烈建议您查看文档并尝试一下。会有很多对你来说不太有意义的东西,但这可能是新 Perl 程序员开始使用的最早的模块之一,它充满了各种各样的简洁的东西。

随着你技能的发展,你会继续回顾并重新阅读文档,因为随着你对 Perl 理解的增加,你会在这个模块中发现新的东西。

于 2013-05-30T01:26:02.010 回答