perl添加文件列的内容

perl添加文件列的内容,perl,add,Perl,Add,基本上我有一个如上所示的文件,并希望添加B列的内容,即8+60+10+60。坦率地说,我不确定是否需要删除第一行文本,以及是否可以使用split函数并将其放入散列中 Column A | Column B | Column C | Column D 35627799100 8 8 2 35627788000 60 34

基本上我有一个如上所示的文件,并希望添加B列的内容,即8+60+10+60。坦率地说,我不确定是否需要删除第一行文本,以及是否可以使用split函数并将其放入散列中

Column A            | Column B    | Column C       |  Column D
35627799100             8               8               2 
35627788000             60              34              45 
35627799200             10              21              21 
35627780000             60              5               8
my%hash=map{split/\s+/,$\u4};

提前谢谢你的帮助

如果您只想对第二列求和,则散列是多余的。你可以这样做,直接在地图上计算总和

my %hash = map {split/\s+/,$_,4} <$file>;

如果第1列可能没有文本(即,该行以一个空格开始,第一个非空格代表第二列),则将模式的第一部分从
^\s+
更改为
^\s*

,这是一个基于数据的示例:

my $sum = 0;

while (<STDIN>)
{
    $sum += $1 if $_ =~ /^\S+\s+(\d+)/;
}
使用严格;
使用警告;
我的$sum\u列\u b=0;
; #落差收割台
while(我的$line=){
$line=~m/\s+(\d+/;#regexpr以捕获第二列值
$sum_column_b+=1美元;
}

打印$sum\u列\u b,“\n”#<代码>$sum+=(拆分“”,$\u3)[1]虽然首选
:它不将整个文件读入内存,但它访问正确的列(数组索引是从零开始的),并通过将生成的片段数量限制为三个,避免拆分过多。顺便说一句,在void上下文中,
map
只意味着你想要一个
for
,而文件句柄上的循环通常应该使用迭代器
while
。或者
$sum+=(split)[1]而
为了简短起见,你知道吗,我输入了一个错误。我的意思是
[1]
,而不是
[2]
,甚至在我离线的测试脚本中也有。我将编辑以上内容以修复它。但是对于
map
while
map
应该和
while
一样懒惰,不是吗?编辑:我刚刚尝试过,在
$sum+=
前面添加
say
,并且
map
在处理之前会发出整个文件的声音。我将在
时将上述内容更改为使用
。我尝试了一下,但出现了一个错误:参数“number”不是数字加法(+),位于./bss_license.pl第7行,第1行。#/usr/bin/perl使用严格;使用警告;我的$sum;打开我的$file,“如果您的输入文件有标题行或类似的行,那么您必须添加额外的逻辑来跳过这些行。例如,在循环中更改为regexp:
while(){$sum+=$1 If$\u=~/^\ S+\S+(\d+)/;}
您能解释一下$line=~m/\S+(\d+)是如何操作的吗?”/;正在捕获第二列吗?$sum_column_b+=$1行中的任何列;为什么使用$1?感谢第一列左侧没有空格。因此regexpr的第一个匹配项是列b:1或更多空格\s+,位于数字(\d+)之前。我用括号将其记为$1。在regexp的开头显式声明
^\S+
以仅匹配具有该属性的行,并将总和放入
if
语句的主体中,这样您就可以显式跳过标题行。在这种情况下,这可能没有多大关系(空字符串充当零),但对我来说,直言不讳更安全。
my $sum = 0;

while (<STDIN>)
{
    $sum += $1 if $_ =~ /^\S+\s+(\d+)/;
}
use strict;
use warnings;

my $sum_column_b = 0;
<DATA>; #drop header

while( my $line = <DATA>) {
    $line =~ m/\s+(\d+)/; #regexpr to catch second column values
    $sum_column_b += $1;
}
print $sum_column_b, "\n";  #<-- prints: 138


__DATA__
Column A            | Column B    | Column C       |  Column D
35627799100             8               8               2 
35627788000             60              34              45 
35627799200             10              21              21 
35627780000             60              5               8