2017-09-28 47 views
1

让我有一个文本文件包含Text.txt如何更换正则表达式作为普通的文本从* INI文件

\mathbf{\mathit{adad09} 
\mathit{\mathit{aavB} 
\mathul{\mathit{AZDs} 

而且我有一个test.ini文件包含(因为用户可以添加或更少的替代

<repl> 
\mathbf{\mathit{([A-z0-9]*)} \boldsymbol{\mathit{$1} 
\mathit{\mathit{([A-z0-9]*)} \italicsymbol{\mathit{$1} 
\mathul{\mathit{([A-z0-9]*)} \underlinesymbol{\mathit{$1} 
</repl> 

我的预期输出是

\boldsymbol{\mathit{adad09} 
\italicsymbol{\mathit{aavB} 
\underlinesymbol{\mathit{AZDs} 

我的编码是这里

use strict; 
use warnings; 
use Cwd; 

my $myinicnt = ""; my $file = "Test.txt"; my $str = ""; 
readFileinString($file, \$str); readFileinString("Test.ini", \$myinicnt); 
my @replsEach =(); 

if($myinicnt=~m/<repl>(.*?)<\/repl>/gs) { @replsEach = split /\n/, $1; } 
foreach my $myvar(@replsEach) 
{ 
    my ($val1, $val2) = split /\t/, $myvar; 
    my $quval1 = quotemeta $val1; 

    #First Attempt 
    $str=~s{$val1}{$val2}gi; 

    #Second Attempt 
    $str=~s{$quval1}{$val2}gi; 
} 

print $str; 

#---------------> File reading 
sub readFileinString 
#---------------> 
{ 
    my $File = shift; 
    my $string = shift; 
    open(FILE1, "<$File") or die "\nFailed Reading File: [$File]\n\tReason: $!"; 
    read(FILE1, $$string, -s $File, 0); 
    close(FILE1); 
} 

#---------------> File Writing 
sub writeFileinString 
#---------------> 
{ 
    my $File = shift; 
    my $string = shift; 
    my @cDir = split(/\\/, $File); 
    my $tmp = ""; 
    for(my $i = 0; $i < $#cDir; $i++) 
    { 
     $tmp = $tmp . "$cDir[$i]\\"; 
     mkdir "$tmp"; 
    } 
    if(-f $File){ 
     unlink($File); 
    } 
    open(FILE, ">$File") or die "\n\nFailed File Open for Writing: [$File]\n\nReason: $!\n"; 
    print FILE $$string; 
    close(FILE); 
} 
#------------------------- SUB END -------------------------> 

错误:

Use of uninitialized value $val1 in quotemeta at ini.pl line 13. 
Use of uninitialized value $val2 in concatenation (.) or string at ini.pl line 18. 
Use of uninitialized value $val1 in regexp compilation at ini.pl line 19. 
Unrecognized escape \m passed through in regex; marked by <-- HERE in m/\m <-- HERE athbf{\mathit{([A-z]*)}/ a 
t ini.pl line 19. 
Unrecognized escape \m passed through in regex; marked by <-- HERE in m/\mathbf{\m <-- HERE athit{([A-z]*)}/ a 
t ini.pl line 19. 
Unrecognized escape \m passed through in regex; marked by <-- HERE in m/\m <-- HERE athit{\mathit{([A-z]*)}/ a 
t ini.pl line 19. 
Unrecognized escape \m passed through in regex; marked by <-- HERE in m/\mathit{\m <-- HERE athit{([A-z]*)}/ a 
t ini.pl line 19. 
Unrecognized escape \m passed through in regex; marked by <-- HERE in m/\m <-- HERE athul{\mathit{([A-z]*)}/ a 
t ini.pl line 19. 
Unrecognized escape \m passed through in regex; marked by <-- HERE in m/\mathul{\m <-- HERE athit{([A-z]*)}/ a 
t ini.pl line 19. 
\mathbf{\mathit{adad09} 
\mathit{\mathit{aavB} 
\mathul{\mathit{AZDs} 

请会有人可以指导我得到的解决方案。

回答

2

如果打印$ quval1,你会看到的问题是什么:

\\mathbf\{\\mathit\{\(\[A\-z0\-9\]\*\)\} 
        ~~~~ ~~ ~~ ~~~~~~ 

quotemeta反斜杠破折号,括号,括号和星号,以及,但你必须让他们unbackslashed 。

但是,您如何识别哪些字符是正则表达式的一部分,哪些属于TeX标记的一部分?

将正则表达式存储在已引用的文件中。

虽然这并没有结束这个故事。 $1是替换没有扩大,因为它不包含在字面上的替换。您可以使用/e开关来评估替换,但是您需要再次在其中反斜杠反斜杠,事实上,您需要双重/ee才能正确评估代码,因此您需要将该字符串换成引号以使其在语法上正确。

数据:

<repl> 
\\mathbf\{\\mathit\{([a-zA-Z0-9]*)\} \\boldsymbol{\\mathit{$1} 
\\mathit\{\\mathit\{([a-zA-Z0-9]*)\} \\italicsymbol{\\mathit{$1} 
\\mathul\{\\mathit\{([a-zA-Z0-9]*)\} \\underlinesymbol{\\mathit{$1} 
</repl> 

代码:

$val2 = qq("$val2"); 
$str =~ s/$val1/$val2/geei; 

我也不得不修复的文件名,为TextTest,并且test三种不同的字符串。

+0

冠军我无法得到所需的输出....帮助我... – ssr1012

+0

错误更新在我的问题请 – ssr1012

+0

你还没有反斜杠的所有反斜杠。 – choroba