使用 Getopt::Long

use strict;
use Getopt::Long;
my ($file,$number);
GetOptions (
“file=s” => $file,
“number=i” => $number,
);

print <<EOF;

file=$file
number=$number

EOF

下了指令

perl cross.pl -file file.txt -number 1

會得到

file=file.txt
number=1

Getoptions 會把我給 -file 後面的值帶給 $file 變數

我可以

perl cross.pl -f file.txt -n 1

也可以

perl cross.pl -fi file.txt -num 1

只要符合  file 及 number 就行,不需要打全字

再來 file=s , s 是 string ,值要符合是字串的,而 number=i,意思是整數

參數跟值中間也可以用等於 =

perl cross.pl -file=file.txt -number=1

只要-file參數有下的話,$file 變數就會得到 1

“file” => $file,

而給一個 + 符號,當 -f -f 兩個時 ,$file 就會得到2

“file+” => $file,

也可以將值帶陣列

my @array;
GetOptions (
“file=s” => @array,
);

hash 也行

use strict;
use Getopt::Long;
my (%hash);
GetOptions (
“file=s” => \%hash,
);

執行參數外,還要什麼等於什麼

perl cross.pl -f a=2 -f b=3

如果不要只用file這個名稱的話,用  |  符號作為名稱間的區隔

GetOptions (
“file|aa=s” => \%hash,
);

還有一種,我想不到它何時會被一定要使用到

Getopt::Long 還有 subroutine 的功能

use strict;
use Getopt::Long;
my ($file);
GetOptions (
“f” => $file,
‘v’ => sub {$file = 0},
);

print “file=$file”;

我下了

perl cross.pl -f

$file 會的到 1

但如果

perl cross.pl -f -v

$file 會得到 0

如果

perl cross.pl -v -f

是會得到1,-v 跟 -f 巔倒就不同結果,

想想,我有需要用到它的地方嗎?

如果不用Getopt::Long ,我自已也有一套使用方式

# 指令選項組成 HASH
my %getopts = ();
if (@ARGV) {
my $hash_ref;
foreach (@ARGV) {
my ($key,$value) = split /=/, $_;
$hash_ref->{“$key”} = “$value” if ($key && $value);
}
%getopts = %$hash_ref if $hash_ref && $hash_ref =~ /HASH/;
}

sub func_start {
print $getopts{file};
}

sub func_usage {
print “
$0 –start file=where
“;
}

# 指令選項
if ($ARGV[0]) {
if ($ARGV[0] eq ‘–start’) {
func_start();
} elsif ($ARGV[0] eq ‘–help’) {
func_usage();
} else {
func_usage();
}
} else {
func_usage();
}

print ”
“;

執行

perl cross.pl –start file=123.txt

得到 123.txt

perdoc Getopt::Long
ref: http://beakdoosan.blogspot.com/2009/05/perl-module-getoptlong.html

Related posts 相關文章
2020 年迎來了 PHP 8 與 Perl 7
More...
安裝 perl 5.8.1 版本 – 草記
More...
perl 備註
More...
perl 隨機產生 password 密碼
More...

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。