使用Perl 6进行批处理文本处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Perl 6进行批处理文本处理相关的知识,希望对你有一定的参考价值。

我正在阅读劳伦特罗森菲尔德的Think Perl 6,以及Allen B. Downey最近的阅读非常好。

它的.tex文件在github here中可用。

它有这样的代码示例:enter image description here

我认为让代码块像这样着色非常有用:enter image description here

为此,我们必须批量处理上面的存储库中包含的所有.tex文件。要做到这一点,我们必须转换乳胶代码:

egin{verbatim}
        say 42 ==  42;           # True
        say 42 ==  42.0;         # True
        say 42 ===  42;          # True
        say 42 === 42.0;         # False
end{verbatim}


egin{verbatim}
$x eq $y            # $x is string-wise equal to $y
$x ne $y            # $x is string-wise not equal to $y
$x gt $y            # $x is greater than $y (alphabetically after)
$x lt $y            # $x is less than $y (alphabetically before)
$x ge $y            # $x is greater than or equal to $y
$x le $y            # $x is less than or equal to $y
$x eqv $y           # $x is truly equivalent to $y
end{verbatim}

egin{minted}{perl6}
        say 42 ==  42;           # True
        say 42 ==  42.0;         # True
        say 42 ===  42;          # True
        say 42 === 42.0;         # False
end{minted}


egin{minted}{perl6}
$x eq $y            # $x is string-wise equal to $y
$x ne $y            # $x is string-wise not equal to $y
$x gt $y            # $x is greater than $y (alphabetically after)
$x lt $y            # $x is less than $y (alphabetically before)
$x ge $y            # $x is greater than or equal to $y
$x le $y            # $x is less than or equal to $y
$x eqv $y           # $x is truly equivalent to $y
end{minted}

我想用Perl 6实现这一目标。这就是我打算做的事情。

THIS IS DUMMY CODE

# First I want to skim all the .tex files in the cloned repo (with git) 

for dir("ThinkPerl6/book") ->$file {
  say $file if $file~~/.tex/;
}

# Read each .tex file and modify, replace `egin{verbatim}` with `egin{minted}{perl6}`

for "$file.tex".IO.lines -> $line {
  substitute with "egin{minted}{perl6}" if $line ~~/egin{verbatim}/;
}

# Read each .tex file and modify, replace `end{verbatim}` with `end{minted}`

for "$file.tex".IO.lines -> $line {
  substitute with "end{minted}" if $line ~~/end{verbatim}/;
}

我无法超越这一点。有帮助吗?使用正则表达式会非常有帮助。

最好的祝福,

苏曼

答案

您需要执行以下步骤:

  • 创建应用了替换的每一行的副本。你可以使用subst method
  • 将修改后的副本写入新文件(可能添加扩展名为.new
  • 可选地,移动.new以覆盖原始文件。请参阅this example获取灵感。

我希望这有帮助。

另一答案

以下是moritz前两个要点的一个实现。

my $fh-out = open "$file.new.tex", :w; # Create a new file

# Print out next file, line by line
for "$file.tex".IO.lines -> $line is copy {

    # Make changes, if needed
    $line.subst-mutate('egin{verbatim}','egin{minted}{perl6}');
    $line.subst-mutate('end{verbatim}','end{minted}');

    # Print line
    $fh-out.put: $line;
}

以上是关于使用Perl 6进行批处理文本处理的主要内容,如果未能解决你的问题,请参考以下文章

《每日一题》NO.77:利用perl对文本进行处理

一个文本处理的perl脚本

perl学习正则表达式处理文本

小白的perl语言之数据分割

Perl在ASIC中的应用——实战篇:网表处理

Perl模式匹配大型连载1--初识正则