Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:逐行添加2个文件_Perl_File - Fatal编程技术网

Perl:逐行添加2个文件

Perl:逐行添加2个文件,perl,file,Perl,File,我是perl的初学者,请耐心听我说 我有两个文件: 1 2 3 及 我想创建一个新文件,它是上述两个文件的总和: 1 2 3 输出文件: 3 6 8 6 我现在正在做的是将文件作为数组读取,然后逐个元素添加它们 要添加我正在使用的阵列,请执行以下操作: $asum[@asum] = $array1[@asum] + $array2[@asum] while defined $array1[@asum] or defined $array2[@asum]; 但这会产生以下错误: Argum

我是perl的初学者,请耐心听我说

我有两个文件:

1
2
3

我想创建一个新文件,它是上述两个文件的总和:

1
2
3
输出文件:

3
6
8
6
我现在正在做的是将文件作为数组读取,然后逐个元素添加它们

要添加我正在使用的阵列,请执行以下操作:

$asum[@asum] = $array1[@asum] + $array2[@asum] while defined $array1[@asum] or defined $array2[@asum];
但这会产生以下错误:

Argument "M-oM-;M-?3" isn't numeric in addition (+) at perl_ii.pl line 30.
Argument "M-oM-;M-?1" isn't numeric in addition (+) at perl_ii.pl line 30.
Use of uninitialized value in addition (+) at perl_ii.pl line 30.
我使用以下代码将文件读取为数组:

use strict;
use warnings;

my @array1;
open(my $fh, "<", "file1.txt") or die "Failed to open file1\n";
while(<$fh>) { 
    chomp; 
    push @array1, $_;
} 
close $fh;

my @array2;
open(my $fh1, "<", "file2.txt") or die "Failed to open file2\n";
while(<$fh1>) {
    chomp;
    push @array2, $_;
}
close $fh1 ;
使用严格;
使用警告;
我的@array1;

打开(my$fh,“您的脚本现在有两个不同的问题:

  • 第一个错误

    参数“M-oM-;M-?3”在perl_ii.pl行不是数字加法(+) 三十

    发生这种情况的原因是输入文件以Unicode格式保存,并且第一行使用“\xFF\xFE”BOM字节读取。 要简单地修复它,只需将文件重新保存为ANSI文本。如果需要Unicode,则从文件中读取的第一个字符串中删除这些字节

  • 第二个错误

    在perl_ii.pl第30行使用未初始化的值加法(+)

    发生这种情况是因为您访问了第一个数组中不存在的第四个元素。请记住,您选择了“最大输入数组长度”作为索引限制。若要解决此问题,请为输入元素添加以下条件:

    $asum[@asum] = (@asum < @array1 ? $array1[@asum] : 0)  + (@asum < @array2 ? $array2[@asum] : 0) while defined $array1[@asum] or defined $array2[@asum];
    
    $asum[@asum]=(@asum<@array1?$array1[@asum]:0)+(@asum<@array2?$array2[@asum]:0)定义为$array1[@asum]或定义为$array2[@asum];
    

  • 您的脚本现在有两个不同的问题:

  • 第一个错误

    参数“M-oM-;M-?3”在perl_ii.pl行不是数字加法(+) 三十

    发生这种情况的原因是输入文件以Unicode格式保存,并且第一行使用“\xFF\xFE”BOM字节读取。 要简单地修复它,只需将文件重新保存为ANSI文本。如果需要Unicode,则从文件中读取的第一个字符串中删除这些字节

  • 第二个错误

    在perl_ii.pl第30行使用未初始化的值加法(+)

    发生这种情况是因为您访问了第一个数组中不存在的第四个元素。请记住,您选择了“最大输入数组长度”作为索引限制。若要解决此问题,请为输入元素添加以下条件:

    $asum[@asum] = (@asum < @array1 ? $array1[@asum] : 0)  + (@asum < @array2 ? $array2[@asum] : 0) while defined $array1[@asum] or defined $array2[@asum];
    
    $asum[@asum]=(@asum<@array1?$array1[@asum]:0)+(@asum<@array2?$array2[@asum]:0)定义为$array1[@asum]或定义为$array2[@asum];
    

  • 完全不同的方法:

    $ paste -d '+' file1 file2 | sed 's/^+//;s/+$//' | bc
    3
    6
    8
    6
    
    paste
    命令打印相邻的文件,并用
    +
    符号分隔:

    $ paste -d '+' file1 file2
    1+2
    2+4
    3+5
    +6
    
    sed命令删除前导和尾随的
    +
    符号,因为这些符号会跳到
    bc

    $ paste -d '+' file1 file2 | sed 's/^+//;s/+$//'
    1+2
    2+4
    3+5
    6
    

    最后计算出总和。

    完全不同的方法:

    $ paste -d '+' file1 file2 | sed 's/^+//;s/+$//' | bc
    3
    6
    8
    6
    
    paste
    命令打印相邻的文件,并用
    +
    符号分隔:

    $ paste -d '+' file1 file2
    1+2
    2+4
    3+5
    +6
    
    sed命令删除前导和尾随的
    +
    符号,因为这些符号会跳到
    bc

    $ paste -d '+' file1 file2 | sed 's/^+//;s/+$//'
    1+2
    2+4
    3+5
    6
    

    然后,
    bc
    最终计算出总和。

    读取两个文件的逻辑是相同的,我建议使用一个子程序并调用两次:

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    my @array1 = read_into_array('file1.txt');
    my @array2 = read_into_array('file2.txt');
    
    sub read_into_array
    {
        my $filename = shift;
        my @array;
        open(my $fh, "<", $filename) or die "Failed to open $filename: $!\n";
        while(<$fh>) { 
            chomp; 
            push @array, $_;
        } 
        close $fh;
        return @array;
    }
    
    不,这不是一个注释,而是一个非常类似于
    |
    的运算符。区别在于,它在左手侧(lhs)为
    undef
    时触发,而
    |
    在左手侧(即
    0
    '
    undef
    时触发。因此

    如果
    $array1[@asum]
    未定义,则给出
    0
    。它与

    defined($array1[@asum]) ? $array1[@asum] : 0
    

    读取两个文件的逻辑是相同的,我建议为此使用一个子程序并调用两次:

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    my @array1 = read_into_array('file1.txt');
    my @array2 = read_into_array('file2.txt');
    
    sub read_into_array
    {
        my $filename = shift;
        my @array;
        open(my $fh, "<", $filename) or die "Failed to open $filename: $!\n";
        while(<$fh>) { 
            chomp; 
            push @array, $_;
        } 
        close $fh;
        return @array;
    }
    
    不,这不是一个注释,而是一个非常类似于
    |
    的运算符。区别在于,它在左手侧(lhs)为
    undef
    时触发,而
    |
    在左手侧(即
    0
    '
    undef
    时触发。因此

    如果
    $array1[@asum]
    未定义,则给出
    0
    。它与

    defined($array1[@asum]) ? $array1[@asum] : 0
    

    下面是另一个Perl解决方案,它使用了菱形文件读取操作符
    。它读取命令行上指定的文件(而不是在程序中显式打开)。很抱歉,我找不到文档中解释这一点的部分

    此程序的命令行如下所示:

    perl myprogram.pl file1 file2>outputfile

    其中file1和file2是2个输入文件,outputfile是要打印添加结果的文件

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    my @sums;
    my $i = 0;
    while (my $num = <>) {
        $sums[$i++] += $num;
        $i = 0 if eof;
    }
    
    print "$_\n" for @sums;
    
    !/usr/bin/perl
    严格使用;
    使用警告;
    我的@sums;
    我的$i=0;
    while(my$num=){
    $sums[$i++]+=$num;
    如果eof为$i=0;
    }
    为@sums打印“$\un”;
    

    注意:
    $i
    在文件末尾重置为零(在这种情况下,在读取第一个文件之后)。实际上,在读取第二个文件后,它也会重置为0。但是,这对程序没有影响,因为在您的示例中,在第二个文件后没有要读取的文件。

    这里是另一个Perl解决方案,它使用菱形,
    ,file read操作符。这将读取命令行上指定的文件,(而不是在程序中明确地打开它们)。对不起,我找不到文档中解释这一点的部分

    此程序的命令行如下所示:

    perl myprogram.pl file1 file2>outputfile

    其中file1和file2是2个输入文件,outputfile是要打印添加结果的文件

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    my @sums;
    my $i = 0;
    while (my $num = <>) {
        $sums[$i++] += $num;
        $i = 0 if eof;
    }
    
    print "$_\n" for @sums;
    
    !/usr/bin/perl
    严格使用;
    使用警告;
    我的@sums;
    我的$i=0;
    while(my$num=){
    $sums[$i++]+=$num;
    如果eof为$i=0;
    }
    为@sums打印“$\un”;
    

    注意:
    $i
    在文件末尾重置为零(在本例中,在读取第一个文件后)。实际上,在读取第二个文件后,它也会重置为0。但是,这对程序没有影响,因为在您的示例中,在第二个文件之后没有要读取的文件。

    以下解决方案使内存为f