请帮我计算文件各行的数值数据, 并找到线长。代码必须用Perl编写。 例如,如果我有一行如:
INPUT:I was born on 24th october,1994.
Output:2
答案 0 :(得分:1)
你可以这样做:
perl -ne 'BEGIN{my $x} $x += () = /[0-9]+/g; END{print($x . "\n")}' file
-n
:导致Perl假定你的程序有以下循环,这使得它迭代文件名参数,有点像sed -n或awk:
LINE:
while (<>) {
... # your program goes here
}
-e
:可用于输入一行程序;
()
将在列表上下文中评估/[0-9]+/g
(即() = /[0-9]+/g
将返回一个包含默认输入中找到的一个或多个数字序列的数组),而{{1}将在标量上下文中再次计算结果(即$x +=
将在默认输入中找到的一个或多个数字的序列数添加到$x += () = /[0-9]+/g
);在整个文件处理完毕后,$x
将打印END{print($x . "\n")
。$x
答案 1 :(得分:0)
我做这样的事情
#!/usr/bin/perl
use warnings;
use strict;
my $file = 'num.txt';
open my $fh, '<', $file or die "Failed to open $file: $!\n";
while (my $line = <$fh>){
chomp $line;
my @num = $line =~ /([0-9.]+)/g;
print "On this line --- " .scalar(@num) . "\n";
}
close ($fh);
我测试的输入文件 -
This should say 1
Line 2 should say 2
I want this line to say 5 so I have added 4 other numbers like 0.02 -1 and 5.23
测试的输出----
On this line --- 1
On this line --- 2
On this line --- 5
使用正则表达式匹配([0-9。] +)将匹配任意数字并包含任何小数(我猜你真的只能使用([0-9] +),因为你只计算它们而不使用实际上是数字代表。)
希望它有所帮助。