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//。 1つの重要な違いがあります。で作成した2つの正規表現をqr//連結すると、各正規表現が最初にラップされます(?:...)。文字列と2番目の文字列。ただし、$baseパイプ記号が含まれている場合、その範囲は囲む.cfの対象となります(?:...)

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

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

さらに、変数名を含む変数を使用すると、正規表現に2番目の変数が挿入されず、1レベルの補間のみが発生します。

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

また、\1二重引用符で囲まれた文字列内で(代替文字列内での置換は二重引用符で囲まれた文字列のように動作します)、Perlが最初の一致グループを引用するchr(1)ため$1に使用されることを意味します。ただし、1レベルの補間のみが発生するため、埋め込み変数を使用しても$1変数は拡張されません。

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

修飾子を使用して2番目の補間を強制できますが、/ee代替部分は構文上Perlコードでなければなりません。

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

おすすめ記事