我有两个输入文件,一个是* TEX文件和* INI。
INI文件包含:(用户可以添加更多图案,但这样)
User-Defined
INPUT文件包含:
\bra{([^{}]*)} \langle $1|\sprangle
\ket{([^{}]*)} \splangle|$1\rangle
\braket{([^{}]*)} \langle $1\rangle
\set{([^{}]*)} \{$1\}
OUTPUT文件应为:
\bra{ahdhaodoaddo4092039585038}
\ket{su093unfs}
\braket{adlkgnaogoaj}
\set{982509unflksndl}
我的代码:
\langle ahdhaodoaddo4092039585038|\sprangle
\splangle|su093unfs\rangle
\langle adlkgnaogoaj\rangle
\{982509unflksndl\}
有人可以帮我这个。
答案 0 :(得分:2)
几个问题:
readFileinString
未提供,因此我们不确切知道发生了什么。
[\t]*
也匹配换行符
$1
不会替换插值。您需要/e
或eval
,但这种方法既脆弱又危险。我试图找到一种更好的方法:只需在$1
上拆分替换,然后将部分粘贴回来,将字符$1
替换为真实的$1
。
\
需要加倍才能保持字面含义。
还有一些小的:
/s
更改.
匹配的内容,但在正则表达式中不使用任何点。
#! /usr/bin/perl
use warnings;
use strict;
sub readFileinString {
my ($filename, $content) = @_;
open my $fh, '<', $filename or die "$filename: $!";
$$content = do { local $/; <$fh> };
}
my ($texfile, $inifile) = @ARGV;
readFileinString($texfile, \ my $texcnt);
readFileinString($inifile, \ my $inicnt);
while ($inicnt =~ /^([^\t]*)\t(.*)/mg) {
my ($find, $rep) = ($1, $2);
$find =~ s/\\/\\\\/g;
my ($pre, $post) = split /\$1/, $rep;
$texcnt =~ s/$find/$pre$1$post/g;
}
print $texcnt;
答案 1 :(得分:1)
您想要评估inifile的第二部分,因此替换
$texcnt=~s/$find/$rep/g;
带
$texcnt=~s/$find/eval "qq($rep)"/eg;
可能会完成这项工作,但使用eval通常是一个糟糕(而且缓慢)的想法。