Perl 프로그램에 명령 행 인수를 전달하려면 어떻게해야합니까?


137

Perl 스크립트를 작성 중입니다. 명령 행 매개 변수를 어떻게 전달할 수 있습니까?

예:

script.pl "string1" "string2"

3
글쎄, 먼저, 당신은 그것이 필요 ./script.pl하거나 런타임에 많은 일이 일어날 것입니다.
Parthian Shot

답변:


189

당신이하고 싶은 일에 달려 있습니다. 두 개의 인수를 입력 파일로 사용하려면 전달하여 <>내용을 읽는 데 사용할 수 있습니다.

서로 다른 의미가있는 경우 쉽게 사용 GetOpt::Std하고 GetOpt::Long처리 할 수 ​​있습니다. GetOpt::Std단일 문자 스위치 만 지원하며 GetOpt::Long훨씬 유연합니다. 보낸 사람 GetOpt::Long:

use Getopt::Long;
my $data   = "file.dat";
my $length = 24;
my $verbose;
$result = GetOptions ("length=i" => \$length,    # numeric
                    "file=s"   => \$data,      # string
                    "verbose"  => \$verbose);  # flag

또는 @ARGV모든 명령 행 인수를 포함하는 특수 변수입니다. $ARGV[0]첫 번째 (즉 "string1", 귀하의 경우)이며 $ARGV[1]두 번째 주장입니다. 에 액세스하기 위해 특별한 모듈이 필요하지 않습니다 @ARGV.


29
$ ARGV [0]이 첫 번째 인수입니다. perl은 0부터 계산되며 프로그램 이름은 @ARGV가 아닌 $ 0입니다.
derobert

4
$ ARGV [0] 혼란에도 불구하고 .. 이것은 SO를 검색 할 때 감사하고 +1을 찾는 일종의 대답입니다.
lexu


60

생각하는 것처럼 전달하고 스크립트에서 배열에서 가져옵니다 @ARGV. 이렇게 :

my $numArgs = $#ARGV + 1;
print "thanks, you gave me $numArgs command-line arguments.\n";

foreach my $argnum (0 .. $#ARGV) {

   print "$ARGV[$argnum]\n";

}

에서 여기 .


8
또한 일부 프로그래밍 언어에서 첫 번째 (0) 인수는 명령 또는 스크립트 자체입니다. 물론 펄에서는 그렇지 않습니다.
danieltalsky

10
대신 $#ARGV + 1당신도 말했다 수@ARGV
레온 Timmermans

1
ARGV[0]또는 $argv[1]특정 인수를 찾고 있다면 사용하십시오 .
Manoj

29
foreach my $arg (@ARGV) {
    print $arg, "\n";
}

각 인수를 인쇄합니다.


getopts를 사용하지 않으면 인수 목록을 비파괴 적으로 순회하는 것이 좋습니다. perlmeme.org/howtos/syntax/foreach.html을 기반으로 구문이 올바른 것처럼 보입니다. 유의할 점은 섹션 확인 부작용 : 제어 변수리스트 소자 별칭
jaredor

24

또는, 더 섹시한 썩은 방법 .....

my ($src, $dest) = @ARGV;

"가정"두 값이 전달됩니다. 추가 코드는 가정이 안전하다는 것을 확인할 수 있습니다.


6
이것이 어떻게 새로운 정보인지는 잘 모르겠지만, 당신이 처음이기 때문에 공감대에 반대하기로 결정했습니다.
Joel Berger

더 섹시하지 않습니다. 모든 인수를 통해 사용할 수 있습니다 @ARGV당신에게서 어떤 조치없이 ARGV /는 argc를 통해 공급 ++ 단지 C / C와 같은
오이겐 Konkov

21

또 다른 옵션은 다음과 같이 perl -s를 사용하는 것입니다.

#!/usr/bin/perl -s

print "value of -x: $x\n";
print "value of -name: $name\n";

그런 다음 다음과 같이 호출하십시오.

% ./myprog -x -name=Jeff
value of -x: 1
value of -name: Jeff

또는 자세한 내용 은 원본 기사 를 참조하십시오.


13

변수 @ARGV목록에 특수 변수 를 지정하여 직접 액세스 할 수 있습니다 . 예를 들어,

( $st, $prod, $ar, $file, $chart, $e, $max, $flag ,$id) = @ARGV;

perl tmp.pl 12 34 5

여기에 이미지 설명을 입력하십시오


7

인수가 읽을 파일 이름 인 경우, 다이아몬드 (<>) 연산자를 사용하여 내용을 가져 오십시오.

while (my $line = <>) {
  process_line($line);
}

인수가 옵션 / 스위치 인 경우 slavy13.myopenid.com에 이미 표시된대로 GetOpt :: Std 또는 GetOpt :: Long을 사용하십시오.

그들이 다른 것일 가능성이있는 경우, 명시 적으로 또는 다음 shift명령을 사용하여 @ARGV를 통해 액세스 할 수 있습니다 .

while (my $arg = shift) {
  print "Found argument $arg\n";
}

(이 shift작업을 수행하면 모든 외부에있는 경우에만 작동합니다 sub.에서 프로그램에 전달 된 sub인수가 sub아닌 전달 된 인수 목록을 검색합니다 .)


5
my $output_file;

if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i"))

{

$output_file= chomp($ARGV[1]) ;


}

2

값을 원한다면 @ARGV 배열을 사용하면됩니다. 그러나 명령 행 옵션 처리를 수행하기 위해 더 강력한 것을 찾고 있다면 Getopt :: Long 을 사용해야합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.