use strict; use warnings
나는 Perl의 다음과 같은 농담이 정말 그리워요 :
perl -ne 'print unless /[0-5],[0-5]?|hernia|.{170,}|benz/' file`
특히 |
. 조건이 많을수록 필터링이 점점 더 불안정해지는 것을 확인했습니다.
데이터 손실 또는 잘못된 명령 작동의 예
123.Symptoms of hernia are all, except: | happy | energetic | sleeping | down regulation of CNS hello | running 5
Signshello of mercedes benz car model: | Big tyres | Even bigger roller | Massive emergency of try | Hello world | All from above 1
정규식이 잘못 작동하는 두 항목입니다.
Perl 문에서 엄격함과 경고를 사용하는 방법은 무엇입니까? 이렇게 긴 조건문을 더 잘 디자인하는 방법은 무엇입니까?
답변1
엄격함과 경고를 원한다면 대답은 "한 줄도 쓰지 마십시오"입니다. 거의 모든 라이너는 코드만 작성하는 Perl의 경향으로 인해 어려움을 겪고 있습니다.
대신 여러 줄로 확장하세요. 정말로 원한다면 HEREDOC을 사용하여 삽입할 수 있습니다.
perl <<ENDPERL
use strict;
use warnings;
print "This is a test\n";
ENDPERL
또는:
perl -Mstrict -Mwarnings -e 'print something'
그러나 실제로는 RE가 경고를 트리거할 가능성이 낮기 때문에 정규식을 디버깅하는 데 도움이 되지 않습니다.
더 긴 조건문의 경우 빠르게 수정하겠습니다. 다음에 사용할 때 누락되는 것에 대해 걱정할 필요가 없도록 적어 두세요. 귀하의 예는 "간단한" grep -v 유형 구성처럼 보입니다.
#!/usr/bin/perl
use strict;
use warnings;
my @patterns_to_skip = ( "hernia",
"ignshello", );
my $regex = join ( "|", map { quotemeta } @patterns_to_skip );
$regex = qr/$regex/;
while ( <> ) {
print unless m/$regex/;
}
답변2
perl -ne 'print unless /hernia|ignshello|...|n/' file
귀하가 제공하는 RE는 ...
3개 이상의 문자( )가 포함된 모든 줄 또는 해당 문자가 포함된 모든 줄 과 일치합니다 n
. 나는 이것이 의도적이라고 생각하지 않지만 아마도 그것이 "불안정하다"고 생각하는 이유일 것입니다.
이 줄에는 변수가 없으므로 use warnings
및 use strict
는 거의 도움이 되지 않습니다.