Perl 플래그 -pe, -pi, -p, -w, -d, -i, -t?


107

나는 다른 플래그로 Perl 코드 나 스크립트를 실행하는 많은 방법을 보았다. 그러나 각 플래그가 의미하는 바에 대해 Google을 검색 할 때 주로 일반 Perl 사이트에 대한 결과를 얻고 플래그 또는 해당 사용에 대한 특정 정보를 찾을 수 없습니다.

다음은 내가 가장 자주 접하는 플래그이며 그 의미를 알지 못합니다.

  • -pe
  • -pi
  • -p
  • -w
  • -d
  • -i
  • -t

그 각각의 의미와 사용 사례를 알려주거나 적어도 그 의미를 찾는 방법을 알려 주시면 매우 감사하겠습니다.


21
perl에 대한 기본 답변을 검색하면 종종 정말 도움이되지 않는 사이트로 연결됩니다. 항상 Perl의 자체 문서를 먼저 확인하십시오.
ysth


2
두 번째. 이 경우 perldoc perlrunPerl이 허용하는 모든 명령 줄 옵션 목록이 있습니다.
Sherm Pendley 2011 년

1
Google 문제 : 빼기 기호는 Google에서 "이 용어 제외"를 의미하는 것으로 해석합니다. 이 동작을 방지하려면 빼기 기호를 포함하는 용어를 따옴표로 묶으십시오.
Roger Krueger 2017

답변:


147

예, Google은 구두점을 찾는 데 악명이 높으며, 안타깝게도 Perl 대부분 구두점으로 구성되어 있습니다. :-)

명령 줄 스위치는 모두 perlrun에 자세히 설명되어 있습니다. (를 호출하여 명령 줄에서 사용 가능 perldoc perlrun)

옵션을 하나씩 간단히 살펴 보겠습니다.

-p : 명령 주위에 인쇄 루프를 배치하여 각 명령에 대해 작동합니다.
    표준 입력 라인. Perl이 이길 수 있도록 주로 사용
    힘과 단순성 측면에서 바지를 벗기다 :-)
-n : 명령 주위에 인쇄되지 않는 루프를 배치합니다.
-e : 프로그램을 인수로 제공 할 수 있습니다.
    파일보다. 스크립트를 생성 할 필요가 없습니다.
    모든 작은 Perl 한 줄짜리 파일.
-i : 입력 파일을 제자리에서 수정합니다 (
    실물). {copy,
    delete-original, rename} 프로세스.
-w : 일부 경고를 활성화합니다. 좋은 Perl 코더라면 이것을 사용합니다.
-d : Perl 디버거에서 실행됩니다. Perl 코드를 디버깅하려면
    명백하게.
-t : 특정 "오염 된"(의심스러운) 코드를 경고 (적절한
    이 모호한 코드에서 오염 모드 오류가 발생합니다). 쇠고기에 사용
    특히 다른 코드를 실행할 때 Perl 보안을
    사용자 (예 : setuid 스크립트 또는 웹 항목)

1
귀하가을 (를) 언급 한 것을 알지 못했습니다 perldoc perlrun. 내 답변을 삭제했습니다. :-)
앨런 학개 Alavi

4
-w실제로 경고를 염두에두고 작성되지 않은 CPAN 모듈을 포함하여 모든 코드에 대한 경고를 활성화하므로 일반적으로 피해야 합니다. 결과는 일반적으로 꽤 시끄럽고 쓸모가 없습니다.
duskwuff -inactive-

9
-w일반적으로 피하지만 use warnings자신의 코드에서 대체해야합니다 .
plusplus

6
@duskwuff : 일반적으로 동의 use warnings하고 내 코드에서 수행하지만 -w는 유용합니다. 잘못 작성된 CPAN 모듈을 제거하는 데 도움이됩니다. :-)
Sherm Pendley 2011 년

2
@IanBytchek 추가 매개 변수를 가져야하는 / 반드시 가져야하는 인수는 압축 된 목록 내에있을 수 없습니다. -i백업을위한 확장을 취합니다. -eperl 명령을 사용합니다. 에서 -0ep 당신이 펄을 말하고있다 'P'는 대신 인수의 펄 명령입니다. 그것은 전혀 잘 풀리지 않을 것입니다.
tjd

10

-p플래그는 기본적으로 스크립트를 실행

while (<>) {
# exec here
}
continue {
    print or die "-p destination: $!\n";
}

-e 스크립트를 전달할 수 있습니다. STDIN

perl -e '$x = "Hello world!\n"; print $x;'

-i인터프리터에게 STDIN실행 스크립트 에 의해 전달 된 모든 데이터가 제자리에서 수행되도록 지시합니다 .

-w과 동일 use warnings;하지만 로컬 범위가 아닌 전역 범위에 있습니다.

-d Perl 디버거를 실행합니다.


2
-w같은 아주 동일하지 않습니다 use warnings후자는 로컬 파일로 범위가,
plusplus

plusplus, true, 패치 답변.
zellio

2
스크립트를 인수로 전달하는 것은 STDIN에서 전달하는 것과 다릅니다. -i는 stdin이 아닌 인수 목록에서 파일 이름을 가져옵니다. STDIN은 종종 제어 터미널과 연관되고 stdin을 읽고 인수 목록을 perl로 설정하는 쉘에서 상속되지만 동일한 것은 아닙니다.
William Pursell

8

다른 사람들은 perlrun을 언급했습니다. 당신이 B :: Deparse를 사용하는 경우, 당신은 할 수 있습니다 볼 수 는 (대부분의 것들에 대한) 의미 :

$ perl -MO=Deparse   -p  -e 1
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

1은 최적화되어 있기 때문에 '???'로 표시됩니다.

$ perl -MO=Deparse   -p -i  -e 1
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

-i는 $ ^ I를 설정합니다.

$ perl -MO=Deparse   -p -i.bak  -e 1
BEGIN { $^I = ".bak"; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

그러나 <ARGV>는 2- 인수 open을 사용하므로로 시작 > <하거나로 시작 / 종료하는 파일 이름은 사용하지 마십시오 |.


4

-n목록에 언급되지 않은 중요한 플래그 가 하나 있습니다 .

-n과 동일하게 작동하지만 기본적으로 -p인쇄되지 않습니다 $_. 이것은 텍스트 파일 필터링에 매우 유용 할 수 있습니다.

이런 식으로 Perl은 grep | sed단일 한 줄로 교체 할 수 있습니다 .

예를 들면 :

perl -ne 'print "$1\n" if /Messages read: (\d+)/' <my_input.txt

"Messages read :"이후에 발견 된 모든 정수 값을 출력합니다.


이것은 더 단순화 될 수 있습니다. "인쇄"$ 1 \ n ""은 필요하지 않습니다. 대신 "인쇄"를 사용할 수 있습니다.
삼켜 진 elysium

아니요, 할 수 없습니다 . ( ) print $1와 같지 않습니다 . printprint $_
rustyx

다음을 수행 echo abc | perl -nw -e "print if (1)"할 수 있습니다. 인쇄 abc합니다. $1참조 할 필요가 없습니다 .
삼켜 진 elysium

@devouredelysium : 예,하지만 전체 줄을 인쇄하지 않고 정규 표현식과 일치하는 숫자 만 인쇄하고 싶습니다.
Ingo Blechschmidt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.