【问题标题】:Getting array elements to end at a particular keyword and shifting the rest to the next line in Perl在 Perl 中让数组元素以特定关键字结尾并将其余元素移至下一行
【发布时间】:2012-06-03 15:15:33
【问题描述】:

我正在将一个文本文件读入 perl 中的数组并循环遍历该数组以对其进行处理。每当有“开始”、“结束”或“;”在文本中的任何位置,我希望我的数组元素在此处结束,并且任何这些关键字之后的任何内容都将出现在下一个元素中,以便以后尝试理解这些元素时让我的生活更轻松。

为了实现这一点,我想将整个文件读入一个数组,将所有“begin”替换为“begin\n”,将“end”替换为“end\n”和“;”使用“;\n”,将此数组写回文件,然后将该文件读回数组。这行得通吗?

有没有更优雅的方法来做到这一点,而不是使用凌乱的额外写入和读取文件?

有没有办法缩短读取文件句柄和写入文件句柄(在电路意义上,如果你知道我的意思!),这样我就可以逃避整个对文本文件的写入,但仍然可以完成我的工作?

古拉杰

【问题讨论】:

    标签: arrays perl split


    【解决方案1】:

    您可以使用带括号的split 在结果中保留分隔符:

    open my $FH, '<', 'file.txt' or die $!;
    my @array = map { split /(begin|end|;)/ } <$FH>;
    

    【讨论】:

    • 谢谢!虽然它对 不起作用,但我做到了 my @array = &lt;$FH&gt;; my @array1 = map { split /(begin|end|;)/ } @array; 并且它起作用了
    【解决方案2】:

    我更喜欢使用 Perl 单行代码并完全避免操作数组:

    $ perl -pi -e 's#(?<=begin)#\n#g; s#(?<=end)#\n#g; s#(?<=;)#\n#g;' file.txt
    

    【讨论】:

    • 逗号是否正确?似乎只有一个开场,没有闭场。我还看到 s/../../ 被使用,# 有相同的含义还是有什么特别的?什么是 ?
    • @gururaj :修复了丢失的撇号。虽然s/// 很常见,但分隔符几乎可以是任何东西,所以s###s!!!s___ 都是等价的。此功能有助于避免分隔符是正则表达式本身的一部分的情况。 ?&lt;= 是一个后视断言。请参阅perldoc perlretut 了解更多信息。
    猜你喜欢
    • 1970-01-01
    • 2020-04-24
    • 2023-01-26
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    相关资源
    最近更新 更多