正则表达式字符应替换为perl中的文本

时间:2018-01-24 08:17:32

标签: perl latex

我有两个输入文件,一个是* 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\}

有人可以帮我这个。

2 个答案:

答案 0 :(得分:2)

几个问题:

  1. readFileinString未提供,因此我们不确切知道发生了什么。

  2. [\t]*也匹配换行符

  3. 变量内的
  4. $1不会替换插值。您需要/eeval,但这种方法既脆弱又危险。我试图找到一种更好的方法:只需在$1上拆分替换,然后将部分粘贴回来,将字符$1替换为真实的$1

  5. \需要加倍才能保持字面含义。

  6. 还有一些小的:

    1. /s更改.匹配的内容,但在正则表达式中不使用任何点。
    2. #! /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通常是一个糟糕(而且缓慢)的想法。