Perl:逐行添加2个文件
我是perl的初学者,请耐心听我说 我有两个文件: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
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