我希望能够以两种方式之一运行我的脚本:
perl script.pl file
perl script.pl -v file
我知道怎么做
perl script.pl -v -f file
但我想这样做而不需要-f for file。
答案 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
因为默认情况下,GetOptions
会auto_abbreviate参数并找出用户尝试传递的参数。
我强烈建议您查看documentation并稍微玩一下。会有很多对你来说没有意义的东西,但这可能是新Perl程序员开始使用的最早的模块之一,而且它充满了各种各样的东西。
随着技能的发展,继续回头重新阅读文档,因为随着您对Perl的理解的增加,您将在此模块中找到新内容。