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,请解释一下你为什么认为它更好?它更干净,噪音更小,而且这句话的作用更明显。“跳过这一行,除非它有一个非空格字符”比“跳过这一行,如果它从开始到结束由零个或多个空格字符组成”要清楚得多