zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Perl @ARGV 获取命令参数

命令 获取 参数 Perl argv
2023-09-14 08:58:44 时间
# temp.pl
use strict;
use warnings;
use Data::Dumper qw(Dumper);
 
print Dumper \@ARGV;

执行上面的代码,打印:

$ perl temp.pl -a=1 -b=2 -c
$VAR1 = [
          '-a=1',
          '-b=2',
          '-c'
        ];

脚本名为“$0”与“FILE”类似

print "$0 \n";
print __FILE__ . "\n"

$ perl temp.pl -a=1 -b=2 -c
temp.pl
temp.pl

从@ARGV提取命令行参数

可以使用常规数组操作符来获取参数

my $name   = $ARGV[0];
my $number = $ARGV[1];

my ($name, $number) = @ARGV;

my $name = shift @ARGV;

检查参数

my ($name) = @ARGV;

if(!defined($name)){
  die "need name.\n";
}

# 简写
my $name = $ARGV[0] // die "need name. \n";

# or set defualt value

my ($name) = @ARGV;
$name = $name // 'default';
print "$name \n";

使用“Getopt::Long”解析参数

#!/usr/bin/perl

use strict;
use utf8;
use autodie;
use warnings;
use Encode qw(decode encode);
use Data::Dumper qw(Dumper);
use Getopt::Long qw(GetOptions);

my $name   = "ajanuw";
my $age = 0;

GetOptions ("name=s" => \$name,    # string
            "age=i"   => \$age)      # string
or die("Error in command line arguments\n");

print "$name - $age \n";

执行上面的脚本:

$ perl temp.pl --name=Ajanuw --age=12 
Ajanuw - 12 

或则其它方式

--age 12
-age 12
-age=12

-a 12

无值参数

my $help;
GetOptions ("help" => \$help) or die("Error in command line arguments\n");
  print "... \n" if(defined($help));

$ perl temp.pl --help
... 

数组参数

my @arr;
GetOptions ("arr=s" => \@arr) or die("Error in command line arguments\n");
print Dumper @arr;

$ perl temp.pl -a=a -a=b
$VAR1 = 'a';
$VAR2 = 'b';

hash参数

my %hash;
GetOptions ("hash=s" => \%hash) or die("Error in command line arguments\n");
print %hash;

$ perl temp.pl --hash name=ajanuw --hash age=12
age12nameajanuw

GetOptions函数仅在相关时才处理以短划线开头的参数及其对应的值。处理完选项后,会将其从@ARGV中删除。(选项名称和选项值都将被删除。)命令行上的其他任何非关联值都将保留在@ARGV中。

use Data::Dumper qw(Dumper);
use Getopt::Long qw(GetOptions);

my $name;
GetOptions ("name=s" => \$name) or die("Error in command line arguments\n");
print "$name \n" if(defined($name));
print Dumper \@ARGV;


$ perl temp.pl -n Ajanuw a.txt b.txt
Ajanuw 
$VAR1 = [
          'a.txt',
          'b.txt'
        ];

处理完选项后,将a.txt和b.txt保留在@ARGV中。现在,我们可以对它们执行任何操作,例如,可以使用foreach遍历@ARGV数组。