在Perl拆分和合并函数中遇到一些问题

时间:2016-04-04 04:22:47

标签: linux perl merge split

首先,我根本不熟悉Perl。我在过去的半年里一直在研究C ++。我现在正在上课,那是教授Linux命令的,我们在Linux上使用的语言上有一些简短的主题,包括Perl,这完全是我的循环(没有双关语)。我有一个文本文件,其中包含一些由空格和制表符分隔的随机数字,甚至可能是换行符,它们通过文件句柄读入程序。我应该写两行代码来分割数字行并将它们合并到一个数组中,在foreach循环中。我不是在寻找答案,只是在正确的方向上轻推。我一直在尝试不同的事情多个小时,感觉完全傻我无法得到它,我完全迷失了语法。它只是有点奇怪的不在编译器内工作和我在C ++之外工作的舒适区。对此,我真的非常感激。我收录了几张照片。基本上,我们编写的代码只是为了存储数字和程序的其余部分将确定所有数字的最小数量和总和。我的目前不正确,因为我不知道该怎么做。在输出照片中,它将显示通过文本文件输入的所有数字,以便您可以看到它们。

code

output

4 个答案:

答案 0 :(得分:5)

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

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

要使用@all_numbers填充每行代码的内容push,您可以使用以下内容:

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

答案 1 :(得分:4)

我希望您需要将所有拆分元素存储到数组中,以便查找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)); 

答案 2 :(得分:4)

你说你“没有找到答案”,所以这是你的轻推:

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

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

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

答案 3 :(得分:1)

另一种方式:

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

请参阅http://perldoc.perl.org/functions/map.html