【问题标题】:Appending to each line of array附加到数组的每一行
【发布时间】:2011-07-25 20:48:01
【问题描述】:

我刚开始接触 Perl,遇到了一个我真的无法在集合框架中完成的练习。基本上,我被要求在数组中每一行的开头附加一个“#”符号。但是我只需要添加 1 行额外的代码并可能修改现有的一行。代码如下:

$file = '/etc/passwd';          
open(INFO, $file);              
@lines = <INFO>;                
close(INFO);                    
print @lines;

任何帮助将不胜感激,

提前致谢

【问题讨论】:

    标签: perl


    【解决方案1】:

    使用 for 循环:

    $_ = '#' . $_ for @lines;
    

    我建议这样做,因为 map 会创建一个新数组,而这会修改现有数组。如果要使用映射,请将数组复制回原始数组。

    @lines = map { '#' . $_ } @lines; ## possibly slower since it creates a new array then copies it
    

    【讨论】:

    • 很棒的反应!非常感谢
    【解决方案2】:

    使用map 命令:

    print map { '#' . $_ } @lines;
    

    【讨论】:

    • 谢谢!这正是我需要的:)
    【解决方案3】:

    您似乎正在尝试this exercise,它来自this tutorial。请不要那样做。你为什么要从一个开头说的教程中学习一门编程语言:

    请注意:本教程是在 1990 年代初为版本编写的 4 Perl。虽然它现在已经明显过时了,但它是一个 多年来为许多人提供的流行信息来源。它有 因此被留在网上作为历史档案的一部分 互联网。

    您最好使用learn.perl.org 中列出的(现代)资源。

    无论如何,这个问题是有缺陷的。你不需要添加一行代码,你只需要修改一个现有的。

    print map { "# $_" } @lines;
    

    【讨论】:

      【解决方案4】:

      它是perl,所以可能有几十种方法,这里是一种:

      print "#" . join('#', @lines);
      

      【讨论】:

        【解决方案5】:
        关闭信息;
        grep{ $_ = "#$_"; undef } @lines;

        如果没有 undef,grep 将组装一个匹配的数组以返回,该数组将被丢弃。由于 undef grep 现在将丢弃所有内容。为什么这样有效,你需要自己去挖掘。

        加分:对不同的解决方案进行基准测试以找到最快的解决方案。查看基准模块

        【讨论】:

          【解决方案6】:

          通过添加前两行,您可以实现这一点。

          $file = "inputfile";
          `sed 's/^/#/g' /etc/passwd > inputfile`;
          open(INFO, $file);
          @lines = <INFO>;
          close(INFO);
          print @lines;
          

          【讨论】:

          • -1 用于:a) 使用额外的文件。 b) 将 perl 中的 sed 用于 perl-stuff c) 在应该使用系统时使用反引号(您忽略了输出,对)。 d) 不检查返回码。
          • @pavel a) 我不明白你为什么要反对使用额外文件?它会完美地工作。 b) 为什么我们不应该使用 perl 中的 sed? d)OP期望一些逻辑来处理他的情况,他不期望如何处理每个语句。不要在不必要的时候利用反对票。
          • @cppcoder 我不认为这个答案特别有用。为什么要使用另一个命令来执行 perl 中的单行命令(拍摄,您可以使用相同的 sed 正则表达式)? OP 的目标是在 perl 中做到这一点。
          • 展示替代方式有什么不好的吗? OP 可以决定适合他需要的任何答案。
          • @cppcoder:OP 想学习 perl,所以在我看来,他更好地帮助了(好的)perl 示例而不是非 perl 替代方案。当然还有很多其他的方法(sed、bash、java、C),但这是一个perl问题,没有别的……
          猜你喜欢
          • 2019-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-11
          • 2014-04-03
          • 2023-03-31
          • 1970-01-01
          • 2014-10-21
          相关资源
          最近更新 更多