Perl One-liner 를 본래 스크립트로 바꾸려면?

이 모든 꽃삽질은, Perl 에 대한 지식이 부족한 상태에서 다소 무리하게 학습(?)을 강행한데서 비롯됐다.
그 와중에, 다음 명령이 이 연구(?)의 시발점이 되었다.

perl -ne 'if ($p) { print; $p = 0 } $p++ if /regex/'

이 명령은, 원하는 문구 바로 다음 줄 내용을 찾게 해준다고 하는데.. 명령이 이해가 되질 않았다. 명령이 이해가 안된다기 보다는, 문법을 몰랐기에, 결과가 어떻게 도출되는지가 그려지질 않았다.

if 가 앞 뒤로 나오고, 앞 명령과 뒷 명령이 세미콜론으로 구분이 되어 있지 않았기에 더 헷갈렸다.

내가 생각한 문법은 이랬었다.

if (/regex/) {
  if ($p) {
     print;
     $p = 0;
  $p++;

그러나, 이대로라면 원하는 결과가 나오지 않는다. 맨 뒤의 if 가 이 명령 전체를 통제하는 if 라고 생각했는데 그게 아니었다.
Perl 을 잘 몰라서 이리 저리 고민을 하다가..

좀 더 확실한 해결책을 찾기에 이르렀고, 그게 바로 perl -MO=Deparse 였다.

$ perl -MO=Deparse -ne 'if ($p) { print; $p = 0 } $p++ if /regex/'
LINE: while (defined($_ = readline ARGV)) {
    if ($p) {
        print $_;
        $p = 0;
    }
    ++$p if /regex/;
}
-e syntax OK

이젠 내가 뭘 잘못 이해했는지 제대로 알게 됐다.
마지막 if 는, 그 바로 앞 ++$p 에만 작용하고, 맨 앞의 if 는 뒤의 if 보다 선행하는 명령이었다.

어쨌든, 앞으로 One-liner 가 이해되지 않을 땐 저 명령으로 간단하게 알아낼 수 있게 됐다.

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.