2014-03-28 5 views
0

나는 펄에서 커맨드 라인 인자를 처리하는 법을 잘 모르며, 누군가가 올바른 방향으로 나아갈 수 있기를 바랬다.Perl 커맨드 라인 인수

내 스크립트는 다음과 같이 인수를 취합니다

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

스크립트는 각 서버의 '삶'과 타임 스탬프 값을 추출 할 수 있어야합니다. 현재 인수를 배열에 저장하고 있습니다.

누구든지이 형식으로 인수를 추출하는 좋은 방법을 알고 있습니까?

감사합니다.

+0

커맨드 라인 인수는 Perl에서'@ ARGV'에 넣어 지므로 그냥 배열을 처리하십시오. –

+4

특정 구문을 사용해야 할 충분한 이유가 없다면 [Getopt :: Long] (https://metacpan.org/pod/Getopt::Long)과 같이 사용하는 것이 좋습니다. '- server1-life 2' 등 – Biffen

+0

@ARGV를 통해 가져올 수 있습니다. –

답변

4

글쎄, 항상 수동으로 인수를 구문 분석 할 수 있습니다. 여기, 우리는 =에서 각 인수를 분할 아마 해시 결과를 저장하려면 :

그러나, 인수 처리는 일반적으로 Getopt::Long 모듈을 수행해야합니다
my %server_configs = map { split /=/, $_, 2 } @ARGV; 
#=> (
# server1_life => 2, 
# server1_ts => "Ts", 
# server2_life => 2, 
# server2_ts => "Age", 
# ) 

:

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' 버그 수정) 그러나 어쨌든 SQL 쿼리를 작성하는 것은 명령 줄 인수 구문 분석과 아무 관련이 없습니다. SQL 쿼리를'prepare'하고'execute' 할 수있는 [DBI 모듈] (https://metacpan.org/pod/DBI)을 대신 찾고있을 것입니다. – amon