2014-03-28 164 views
0

我不知道如何去處理perl中的命令行參數,並希望有人能指出我的方向。Perl命令行參數

我的腳本將採取的參數是這樣的:

$perl my_script.pl server1_life=2 server1_ts=Ts server2_life=2 server2_ts=Age 

腳本需要能夠提取「生活」和時間戳值每個服務器。 目前我正在將參數存儲在數組中。

有沒有人知道以這種格式提取參數的好方法?

謝謝

+0

命令行參數在Perl中被放入'@ ARGV',所以只需處理該數組。 – 2014-03-28 09:39:31

+4

除非你有一個很好的理由來擁有這個特定的語法,否則我會推薦使用(類似於)[Getopt :: Long](https://metacpan.org/pod/Getopt::Long),並讓它' server1-life 2'等。 – Biffen

+0

您可以通過@ARGV取回。 –

回答

4

那麼,人們總是可以手動解析參數。在這裏,我們希望每一個參數在=分裂和可能的結果存儲在一個哈希:

my %server_configs = map { split /=/, $_, 2 } @ARGV; 
#=> (
# server1_life => 2, 
# server1_ts => "Ts", 
# server2_life => 2, 
# server2_ts => "Age", 
# ) 

然而,參數處理通常應與Getopt::Long模塊進行:

use Getopt::Long; 

my %args; 
GetOptions(\%args, '[email protected]', '[email protected]'); 

# combine the config parts for each server 
my @server_configs = map { [$args{ts}[$_], $args{life}[$_]] } 0 .. $#{ $args{ts} }; 
#=> ([Ts => 2], [Age => 2]) 

# or: 
my %server_configs; 
@server_configs{@{ $args{ts} }} = @{ $args{life} }; 
#=> (Ts => 2, Age => 2) 

例如被調用爲script.pl --ts=Ts --life=2 --ts=Age --life=2

+0

這看起來大致是我正在尋找的,我遇到的困難是從每個服務器提取的細節都必須內置到每個表(稱爲服務器)的MySQL命令中。 – Caledonia91

+0

出於某種原因,perl不喜歡映射中的[$ i],它表示它必須聲明爲全局變量,但是這只是表示該值是一個整數?對? – Caledonia91

+0

@ Caledonia91(修復'$ i' bug)但無論如何,構建SQL查詢與命令行參數分析無關。您可能正在尋找[DBI模塊](https://metacpan.org/pod/DBI),您可以使用它來「準備」和「執行」SQL查詢。 – amon