프로그래밍Perl 개발자

Perl의 정규 표현식의 특징은 무엇입니까? 어떤 수정자가 있으며 일치 결과를 올바르게 처리하는 방법은 무엇입니까? 정규 표현식을 사용하여 문자열을 파싱하는 예를 제시하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변

Perl은 정규 표현식을 다루는 데 매우 강력한 언어입니다. 일치를 위해 =~!~ 연산자를 사용합니다.

정규 표현식의 수정자:

  • i — 대소문자를 구분하지 않음
  • g — 전역 검색 (모든 항목 찾기)
  • m — 다중 행 모드 (각 행에 대해 ^ 및 $가 작동)
  • s — 점 (.)이 새 줄 문자를 포함함

예시:

my $text = "My email: max@mail.com and ann@ya.ru."; while ($text =~ /([\w.]+@[\w.]+)/g) { print "Email: $1 "; }

이 예제에서 루프는 문자열에서 모든 이메일을 추출합니다.

일치 후, 값은 특별한 변수 $1, $2, ... (각 캡처 그룹에 따라)에 저장됩니다.

반전 질문

정규 표현식에서 실패한 검색 후 변수 $1에 무엇이 저장됩니까?

답변:

$1은 실패한 일치 시 업데이트되지 않으며, 마지막 성공적인 일치 값을 저장합니다. 이는 잠재적인 오류의 원인이 될 수 있습니다! 따라서 복잡한 조건에서는 $1, $2, ...를 명시적으로 지우는 것이 좋습니다.

주제의 미세한 차이로 인한 실제 오류 사례


이야기

복잡한 정규 표현식으로 입력 데이터를 유효성 검사하는 것에 $1의 값이 의존했습니다. 적합한 문자열을 찾지 못한 후, 변수 $1은 변경되지 않았고, 처리는 이전 잘못된 이메일 주소로 진행되었습니다.


이야기

프로그래머가 수정자를 잘못 설정했습니다. 대형 텍스트에서 /abc/g를 사용하여 다중 행 모드로 기대했지만, 결과적으로 패턴이 줄 바꿈이 있는 필요한 문자열을 찾지 못했습니다. 대신, /abc/ms를 사용해야 했습니다.


이야기

프로젝트에서 모든 항목을 찾기 위해 전역 플래그 /g를 사용하는 것을 잊었습니다. 결과적으로 스크립트는 첫 번째 일치 항목만 추출하고, 사용자는 전체 데이터 목록을 기다렸습니다.