Perl 정규 표현식이 아포스트로피와 일치하지 않습니다.

Perl 정규 표현식이 아포스트로피와 일치하지 않습니다.

여러 스크립트를 정식 형식으로 변환하기 위해 Perl 스크립트를 작성하려고 합니다. 대본이 기대되네요

#!/usr/bin/perl -W
use File::Spec;
use Getopt::Long 2.3203 qw(:config auto_help auto_version);
use IO::File;
my  $base = '[A-Z]|\\\w+\{[A-Z]\}';
my  $tag  = '[a-z]|\{[A-Z]\+1\}|\\[A-Z]+';
my  $sub  = '_(?:$tag)';
my  $sup  = '[\']?(?:\^$tag)?';
my  $term = "$base(?:$sup)?(?:$sub)?";
my  $fbtb = qr/(\\Id)\^\{($term)\}_\{($term)\}/ix;
my  $ft   = qr/(\\Id)\^($term)_($term)/ix;
my  $t    = qr/(\\Id)_($term)/ix;
my  $btt  = qr/(\\Id)_\{($term),($term)\}/ix;
my  $bt   = qr/(\\Id)_\{($term)\}/ix;
my  $bpt  = qr/(\\Id)_\{($term(?:,$term)+)\}/ix;
my  $t1   = "\1\[\{\2\}\]";
my  $t2   = "\1\[\{\2\},\{\3\}\]";
while (my $ifn=shift) {
  my $ofn = $ifn.'new';
  my ($ifh,$ofh);
  open IFH,'<',$ifn or die "Unable to open $ifn for input\n";
  open OFH,'>',$ofn or die "Unable to open $ofn for output\n";
  while (<IFH>) {
    m/(\\Id)_{($base(?:$sup)),($base')/ix
      and print STDOUT "Match 1 $&\n";
    m/(\\Id)_{($base)/ix
      and print STDOUT "Match 2 $&\n";
    m/(\\Id)_{([A-Z]|\\\w+\{[A-Z]\}\^$tag)/ix
      and print STDOUT "Match 3 $&\n";
    s/$fbtb/$t2/ix
      and print STDOUT "Changed $&\n";
    s/$ft/$t2/ix
      and print STDOUT "Changed $&\n";
    s/$btt/$t2/ix
      and print STDOUT "Changed $&\n";
    s/$bpt/$t1/ix
      and print STDOUT "Changed $&\n";
    s/$bt/$t1/ix
      and print STDOUT "Changed $&\n";
    s/$t/$t1/ix
      and print STDOUT "Changed $&\n";
    print OFH;
  }
}

아래 데이터의 모든 행과 일치하지만 아포스트로피 뒤에 중괄호가 오는 경우에는 일치하지 않습니다.

$\seqname{R} = \Range(\funcseqname{f})$. Then $ID_\seqname{R}$ is a left
$\compose[()]$ identity for $\funcseqname{f}$ and $ID_\seqname{D}$ is a
$\funcname{f} \maps S \to T' \defeq \Id_{T,T'} \compose \funcname{f}$
the inclusion map $\Id_{A',A} \maps A' \hookrightarrow A$ is a
$\Id_{\seqname{S}^i,\seqname{S}^{i+1}}$ is open and continuous, hence
The inclusion map $\Id_{A'} \maps A' \hookrightarrow A$ is continuous.
      \Id_{S^1_{\alpha_\beta}, S^2_{\alpha_\beta}}
Then $\ID_{\seqname{S}}$ $\Sigma$-commutes with
and $\ID[{\seqname{S}}] = \ID_{\seqname{S},\seqname{S}}$.
$\Id_{S^1_\alpha,S^2_\alpha} \arin \catname{S}^2_\alpha$ and
$\Id_{S_\alpha,S_\alpha} = \Id[{S_\alpha}] \arin \catname{S}_\alpha$ and
  \ID_{(E^1,\seqname{C}^1),(E^2,\seqname{C}^2)},
$\Id_{I.U^2}$ is a morphism of $\seqname{E}^2$. Then define
containing $u^1$. $\Id_{U,\seqname{E}^1}$ is a morphism of
$\catname{E}^1 \subcat[full-] \catname{E}^2$, $\Id_{U,\seqname{E}^1}$ is
is $\Id_{(\seqname{A}^i, \seqname{E}^i, \seqname{C}^i}$.
is $\Id_{(\seqname{A}^i, \seqname{E}^i, \seqname{C}^i}$.
$\Id_{(\seqname{A}^i, \seqname{E}^i, \seqname{C}^i}$.
    (\Id_{\pi_1(\seqname{E}^i)}, \Id_{\pi_1(\seqname{C}^i)}),
\Id_{\Functor^\Ck_{\M,\Ck} (\seqname{A}^i, \seqname{E}^i, \seqname{C}^i)}
%\Id[{\seqname{L}^1}] = \Id_{\Functor^{\Ck,\catseqname{M}}_{\Man,\LCS}(\seqname{S}^i)}
   \bigl ( \Id[{\Triv{E^i}}], \Id_{\Triv[\Ck-]{C^i}} \bigr ),
$\Id_{(\seqname{A}^i, \seqname{E}^i, \seqname{C}^i}$ is an identity
    (\Id_{\Triv{E^i}}, \Id[C^i]),
    (\Id_{\Triv{E^i}}, \Id[C^i]),
    (\Id_{\Triv{E^i}}, \Id[C^i]),
    (\Id_{\Triv{E^i}}, \Id[C^i]),
$\Bun \seqname{B}$ is a category and $Id_{B^\alpha}$ is the identity

답변1

정규식을 작성하기 위해 문자열을 사용하는 대신 을 사용하십시오 qr//. 한 가지 중요한 차이점이 있습니다. 에서 생성한 두 개의 정규식을 qr//연결하면 각 정규식이 먼저 로 래핑됩니다 (?:...). 문자열과 두 번째 문자열. 그러나 $base파이프 기호가 포함된 경우 해당 범위는 둘러싸는 .cf의 적용을 받습니다 (?:...).

my $s = "A',";
my $r = 'A|\{';

print $s =~ $_ ? 1 : 0
    for qr/$r,/,      # 1
        qr/(?:$r),/;  # 0

또한 변수 이름이 포함된 변수를 사용하면 정규식에 두 번째 변수가 삽입되지 않으며 한 수준의 보간만 발생합니다.

my $r = 'A';
my $s = '$r';
print "A" =~ /$s/;  # Doesn't match.

또한, \1큰 따옴표로 묶인 문자열 내에서(대체 문자열 내에서의 교체는 큰 따옴표로 묶인 문자열처럼 동작함) chr(1).Perl이 $1첫 번째 일치 그룹을 인용하기 위해 사용한다는 것을 의미합니다. 그러나 한 수준의 보간만 발생하므로 포함된 변수를 사용해도 $1변수가 확장되지는 않습니다.

my $s = 'ABC';
my $r = '$1';
say $s =~ s/(A)BC/$r/r;  # $1

수정자를 사용하여 두 번째 보간을 강제 할 수 있지만 /ee대체 부분은 구문상 Perl 코드여야 합니다.

my $s = 'ABC';
my $r = '"(" . $1 . ")"';
say $s =~ s/A(B)C/$r/ree;  # (B)

관련 정보