如何使用perl删除文件中可用的最后一行。
我的数据如下所示。
"A",1,-2,-1,-4,
"B",3,-5,-2.-5,
如何删除最后一行...我在汇总所有数字,但最后收到一个空值。
尝试使用chomp但没有工作。
以下是目前使用的代码:
while (<data>) {
chomp(my @row = (split ',' , $_ , -1);
say sum @row[1 .. $#row];
}
答案 0 :(得分:1)
试试这个(shell one-liner):
perl -lne '!eof() and print' file
或作为剧本的一部分:
while (defined($_ = readline ARGV)) {
print $_ unless eof();
}
答案 1 :(得分:1)
您应该使用Text::CSV
或Text::CSV_XS
来处理逗号分隔值文件。这些模块可在CPAN上使用。这种解决方案看起来像这样:
use Text::CSV;
use List::Util qw(sum);
my $csv = Text::CSV->new({binary => 1})
or die "Cannot use CSV: " . Text::CSV->error_diag;
while(my $row = $csv->getline($fh)) {
next unless ($row->[0] || '') =~ m/\w/; # Reject rows that don't start with an identifier.
my $sum = sum(@$row[1..$#$row]);
print "$sum\n";
}
如果你遇到一个没有使用正确的CSV解析器的解决方案,那么至少你需要在你的chomp之后立即将它添加到你现有的while循环中:
next unless scalar(@row) && length $row[0]; # Skip empty rows.
此行的要点是检测行何时为空 - 没有元素,或者在chomp之后元素为空。
答案 2 :(得分:0)
我怀疑这是一个X / Y问题。您认为在实际应该确保所有输入数据都是您期望的格式时,您希望避免处理输入中的最终(空?)行。
您可以采取多种措施来检查数据的有效性。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use List::Util 'sum';
use Scalar::Util 'looks_like_number';
while (<DATA>) {
# Chomp the input before splitting it.
chomp;
# Remove the -1 from your call to split().
# This automatically removes any empty trailing fields.
my @row = split /,/;
# Skip lines that are empty.
# 1/ Ensure there is data in @row.
# 2/ Ensure at least one element in @row contains
# non-whitespace data.
next unless @row and grep { /\S/ } @row;
# Ensure that all of the data you pass to sum()
# looks like numbers.
say sum grep { looks_like_number $_ } @row[1 .. $#row];
}
__DATA__
"A",1.2,-1.5,4.2,1.4,
"B",2.6,-.50,-1.6,0.3,-1.3,