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

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

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

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

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



답변

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

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

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

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


답변

-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 디버거를 실행합니다.


답변

다른 사람들은 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을 사용하므로로 시작 > <하거나로 시작 / 종료하는 파일 이름은 사용하지 마십시오 |.


답변

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

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

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

예를 들면 :

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

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


답변