Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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/2/jsf-2/2.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脚本由于空行而计算错误_Perl_Count - Fatal编程技术网

perl脚本由于空行而计算错误

perl脚本由于空行而计算错误,perl,count,Perl,Count,下面的脚本基本上是捕获第二列并计算值。我遇到的唯一一个小问题是文件末尾有空行(这是值的导出方式),由于这些空行,脚本计算错误。有什么想法吗?谢谢 my $sum_column_b = 0; open my $file, "<", "file_to_count.txt" or die($!); while( my $line = <$file>) { $line =~ m/\s+(\d+)/; #regexpr to catch second column values

下面的脚本基本上是捕获第二列并计算值。我遇到的唯一一个小问题是文件末尾有空行(这是值的导出方式),由于这些空行,脚本计算错误。有什么想法吗?谢谢

my $sum_column_b = 0;
open my $file, "<", "file_to_count.txt" or die($!);

while( my $line = <$file>) {
    $line =~ m/\s+(\d+)/; #regexpr to catch second column values
    $sum_column_b += $1;
}
print $sum_column_b, "\n";
my$sum\u column\u b=0;

打开我的$file,“尝试将此行放在while行之后:

next if ( $line =~ /^$/ );

基本上,如果当前行没有内容,则循环到下一行。

尝试将这一行放在while行之后:

next if ( $line =~ /^$/ );

基本上,如果当前行没有内容,则循环到下一行。

主要问题是,如果正则表达式不匹配,那么$1将保留它在上一次成功匹配中收到的值。因此,每一个空行都会导致上一行重新计数

一项改进是:

my $sum_column_b = 0;
open my $file, "<", "file_to_count.txt" or die($!);

while( my $line = <$file>) {
    next if $line =~ /^\s*$/;  # skip "empty" lines 
    # ... maybe skip other known invalid lines

    if ($line =~ m/\s+(\d+)/) { #regexpr to catch second column values
        $sum_column_b += $1;
    } else {
        warn "problematic line '$line'\n"; # report invalid lines
   }
}
print $sum_column_b, "\n";
my$sum\u column\u b=0;

打开我的$file,“主要问题是,如果正则表达式不匹配,那么$1将保留它在上一次成功匹配中收到的值。因此,每一个空行都会导致上一行再次计数

一项改进是:

my $sum_column_b = 0;
open my $file, "<", "file_to_count.txt" or die($!);

while( my $line = <$file>) {
    next if $line =~ /^\s*$/;  # skip "empty" lines 
    # ... maybe skip other known invalid lines

    if ($line =~ m/\s+(\d+)/) { #regexpr to catch second column values
        $sum_column_b += $1;
    } else {
        warn "problematic line '$line'\n"; # report invalid lines
   }
}
print $sum_column_b, "\n";
my$sum\u column\u b=0;

打开我的$file,“我认为主要问题已经确定,您正在使用
$1
,但它没有条件地绑定到正则表达式匹配,这会导致您在不应该添加值的情况下添加值。这是一种替代解决方案:

$sum_column_b += $1 if $line =~ m/\s+(\d+)/;
通常,除非您检查预期的正则表达式是否成功,否则不应使用
$1

if ($line =~ /(\d+)/) {
     $sum += $1;
}
或者对变量使用直接赋值:

my ($num) = $line =~ /(\d+)/;
$sum += $num;
请注意,您需要通过在变量周围添加括号来使用列表上下文,否则正则表达式将简单地返回
1
,以获得成功。还请注意,正如Borodin所说,当匹配失败时,这将给出一个未定义的值,您必须添加代码来检查该值

这在捕获多个值时非常方便:

my @nums = $line =~ /(\d+)/g;

我认为主要问题已经确定,您正在使用
$1
,但它没有条件地绑定到正则表达式匹配,这会导致您在不应该添加值时添加值。这是一种替代解决方案:

$sum_column_b += $1 if $line =~ m/\s+(\d+)/;
通常,除非您检查预期的正则表达式是否成功,否则不应使用
$1

if ($line =~ /(\d+)/) {
     $sum += $1;
}
或者对变量使用直接赋值:

my ($num) = $line =~ /(\d+)/;
$sum += $num;
请注意,您需要通过在变量周围添加括号来使用列表上下文,否则正则表达式将简单地返回
1
,以获得成功。还请注意,正如Borodin所说,当匹配失败时,这将给出一个未定义的值,您必须添加代码来检查该值

这在捕获多个值时非常方便:

my @nums = $line =~ /(\d+)/g;
!/usr/bin/perl
使用警告;
严格使用;
我的$sum\u列\u b=0;
打开我的$file,“
#”/usr/bin/perl
使用警告;
严格使用;
我的$sum\u列\u b=0;

打开我的$file,“如果没有匹配,$1将保留以前的值。更好的写入方法是($line=~m/\s+(\d+){$sum_column_b+=$1;}如果没有匹配,$1将保留以前的值。更好的写入方法是($line=~m/\s+(\d+){$sum_column_b+=$1;}”您对
$num
的列表分配忽略了关于检查模式匹配是否成功的要点。如果字符串中没有数字,您的程序将生成类似
使用未初始化值的警告。使用
无警告“未初始化”
而不是JU是一个奇怪的选择t检查匹配的状态i添加了在一般情况下显示备用方法的选项,但是是的,在这种情况下,它不是最佳方法,因为它会发出警告。但是,它不会更改总和,并且该值将适用于给定的输入行。您对
$num
的列表分配忽略了您所做的点关于检查模式匹配是否成功。如果字符串中没有数字,您的程序将生成类似于
使用未初始化值之类的警告。使用
无警告“未初始化”
而不是仅检查匹配状态是一个奇怪的选择。我添加了该选项以显示备用m在一般情况下是ethod,但是是的,在这种特殊情况下,它不是最好的方法,因为它给出了一个警告。但是,它不会改变总和,并且该值将适合给定的输入行。
next如果$line=~/^\s*$/
编写得更好
next除非$line=~/\s/
除非您不喜欢unlessNo,否则它更好这样,不管你喜欢还是不喜欢,你想解释一下为什么你认为它更好吗?它更干净,噪音更小,语句的作用也更明显。“跳过这一行,除非它有一个非空格字符”比“跳过这一行,如果它从头到尾由零个或多个空格字符组成”要清楚得多“
下一步如果$line=~/^\s*$/
写得更好
下一步除非$line=~/\s/
除非你不喜欢unlessNo,不管你喜欢与否,这样做都更好mm,请解释一下你为什么认为它更好?它更干净,噪音更小,而且这句话的作用更明显。“跳过这一行,除非它有一个非空格字符”比“跳过这一行,如果它从开始到结束由零个或多个空格字符组成”要清楚得多