여러 스크립트를 정식 형식으로 변환하기 위해 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)