【问题标题】:Having some issues with Perl Splitting and Merging FunctionsPerl 拆分和合并函数存在一些问题
【发布时间】:2016-04-04 04:22:47
【问题描述】:

首先,我对 Perl 一点也不熟悉。在过去的 1/2 年里,我主要学习 C++。我现在在一堂课上教授 Linux 命令,我们有一些关于 Linux 中使用的语言的简短主题,包括 Perl,这完全让我陷入了循环(不是双关语)。我有一个文本文件,其中包含一堆由空格和制表符分隔的随机数,甚至可能是换行符,它们通过文件句柄读入程序。我应该编写 2 行代码来拆分数字行并将它们合并到一个数组中,在 foreach 循环内。我不是在寻找答案,只是朝着正确的方向轻推。我已经尝试了几个小时不同的东西,感觉完全愚蠢我无法理解,我完全迷失了语法。只是有点奇怪,不在编译器内工作,在我的舒适区之外工作在 C++ 之外。对此,我真的非常感激。我已经附上了几张照片。基本上,我们编写的代码只是为了存储数字,程序的其余部分将确定最小的数字和所有数字的总和。我的目前不正确,因为我不确定该怎么做。在输出照片中,它将显示通过文本文件输入的所有数字,以便您看到它们。

【问题讨论】:

    标签: linux perl merge split


    【解决方案1】:

    这里有几件事要解决。首先,请不要发布您的示例数据或代码的屏幕截图,因为它无法复制和粘贴来测试您的代码或数据。通过在代码块前缩进四个空格和换行符来发布您的代码/数据。

    在您的脚本中添加use strict;。这应该是你班上的第 0 课。之后将my 添加到所有变量声明中。

    要使用每行数字的内容填充@all_numbers,而不使用push,您可以使用以下内容:

    foreach my $line (@output_lines)
    {
        my @numbers = split /\s/, $line;
        @all_numbers = (@all_numbers, @numbers);
    }
    

    【讨论】:

    • 我意识到这很不方便。我只发布了我的代码的照片,而不是代码,以防止它被搜索。不确定我的教授们对堆栈溢出的看法(如果有的话)。不过,他们都没有提到不使用社区的帮助。这是我唯一的理由。其次,课程内容丰富,但我们不会在任何一个主题上花费大量时间。例如,我们在讲座中只花 4 个小时在 Perl 上,而我的两个学期已经专门用于 C++。谢谢,我认为这真的很接近想要的。
    • 我只是不确定如何标注第二个合并行,非常感谢。
    • 就是这样。 100%的。非常感谢。
    • @joe_04_04 从社区寻求帮助并没有错,除非您在不尝试任何事情的情况下要求完整的代码。
    • @Raju 我尽我所能从不寻求任何问题的全面帮助。在我之前关于 C++ 的帖子中,我只要求对我可能会遇到的问题的一小部分进行微调。我对自己学习这一切非常固执,因为我真的很想学习这个领域,但有时你会在这么多小时内把头撞到墙上太多,你只需要来自更聪明的人的提示。谢谢你们的帮助。
    【解决方案2】:

    你说你“不是在寻找答案”,所以这是你的助推器:

    你快到了。您很好地分割每一行(使用split/\s/)并将数值存储在@all_numbers 中。但是,请注意,每次在循环中,您都用您在当前行中找到的数字替换(使用赋值 @all_numbers = ...@all_numbers 的全部内容。实际上,您正在丢弃从前几行中存储的所有内容。

    相反,您想添加@all_numbers,而不是替换@all_numbers。请查看push() function 了解如何执行此操作。

    注意:您的split() 调用很好,但在这种情况下更习惯使用split(' ', $line)。 (请参阅split():当您想在任何空格上拆分时,可以使用单个空格 ' ',而不是模式 /\s/。)

    【讨论】:

    • 查看我的输出,我意识到输出只是最后一行,我有点想我正在覆盖它,但我不知道如何访问数组的每个元素。在 C++ 中,我们只需要在数组的下标中使用 for 循环递增或递减计数器来访问每个新元素,但我不知道如何在此处执行此操作。我会研究一下推送功能,但它可能超出了所学课程的范围,所以我可能必须找到替代方法。
    • 我几乎可以肯定他们希望您在这里熟悉 push() 并使用它。它是 Perl 语言的核心。而且使用起来也很简单;不要回避它:-)
    【解决方案3】:

    我希望您需要将所有拆分元素存储到数组中,因此您正在寻找push 函数。

    foreach $line (@input_lines)
    {
        push(@all_numbers,split(/\s/,$line));
    
    }
    

    您的问题是,在每次迭代中,拆分的值都被覆盖在一个数组中,而不是附加在一起。例如,

    @array = qw(one two three);
    @array = qw(five four seven); 
    print "@array";   
    

    输出是five four seven 而不是one two three five four seven,因为这是用新值重新初始化。您想在使用 unshiftpush 之前或之后在数组中附加新值 例如

    @array = qw(one two three);
    push(@array,qw(five four seven)); 
    

    【讨论】:

    • 在您的第一个代码块中,我认为您有一个小错字,并打算在 $line 而不是 $_ 上拆分
    • 我讨厌对此“嗤之以鼻”,但 OP 正处于他 [可能] 需要示例中的精确度的阶段。此外,到目前为止,您是唯一一个使用 push 的人,这是最干净/最快的方式 [尽管 sferncik 确实 通过链接到文档来做同样的事情]
    【解决方案4】:

    另一种方式:

    my @all_numbers = map { split ' ', $_ } @output_lines;
    

    http://perldoc.perl.org/functions/map.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多