이 모든 꽃삽질은, 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 가 이해되지 않을 땐 저 명령으로 간단하게 알아낼 수 있게 됐다.