我正在学习Perl,但我不知道如何解决这个问题。
我有一个.txt
以下形式的文件:
1 16.3346384
2 11.43483
3 1.19819
4 1.1113829
5 1.0953443
6 1.9458343
7 1.345645
8 1.3847385794
9 1.3534344
10 2.1117454
11 1.17465
12 1.4587485
第一列仅包含行号,此处不感兴趣,但它存在于文件中;第二列中的值是相关部分。
我想输出第二列中编号小于 2.00 的最长连续行序列。对于上面的示例,这将是第 3 行到第 9 行,输出应为:
1.19819
1.1113829
1.0953443
1.9458343
1.345645
1.3847385794
1.3534344
Perl 一行:
多行以获得更好的可读性:
1 个内衬
awk
:多线:
这不是一个微不足道的任务。关于提供完成的程序是否有助于其他人学习用编程语言解决问题也存在争议,但我相信它有其优点,所以我提出以下程序(我们称之为
findlongestsequence.pl
:您可以将该程序称为
这将首先使用 解释命令行参数
Getopt::Long
。然后它将打开文件并逐行读取它,并在
$lineno
. 每行都将在空白处分成几列。$limit
($ingroup
为零)的行中,但遇到合适的行,它将记录它现在在这样的组中($ingroup
设置为1),存储组开始$groupstart
并开始缓冲数组中第 2 列的值@groupbuf
。$limit
,它将识别组尾并计算其长度。如果这比先前记录的最长组长,则新最长组的内容 (@groupbuf
) 和长度 ($currlength
) 分别复制到@longestgroup
和$maxlength
。由于组可能由文件结尾而不是带有值 > 的行终止
$limit
,因此如果$ingroup
在文件结尾处为 true,也执行此检查。最后,
@longestgroup
打印的内容\n
作为标记分隔符。使用任何 awk:
也许是这样的:
或者,如果您不想查看最大行组中的行数,而是希望根据对问题的更新编辑来查看这些行:
如果,正如有人在您的问题中编辑的那样,行号是数据的一部分,请添加选项
-a
(awk 模式,其中记录被分割到@F
数组中)并将$_
(整个记录)替换为$F[1]
(第二个字段,$F[0]
是第一个字段)。<>
用于读取输入和触发器运算符的惯用解决方案。使用Raku(以前称为 Perl_6)
或者:
以下是用 Raku(Perl 编程语言家族的成员)编写的答案。Raku 具有有理数功能,如果您在执行简单的数学运算时需要保持精度(例如
say 0.1 + 0.2 - 0.3;
)。$_
第一个答案使用非自动打印逐行标志读取行-ne
。a@max
和@tmp
array 都已声明。该行在空白处断开words
并.=
保存回$_
。如果 (if
statement).[1]
第二列满足条件,则将值push
添加到@tmp
数组中。如果没有,则该@tmp
数组将覆盖该@max
数组(如果它有更多elems
(元素))。不管怎样,@tmp
数组是Empty
(清空的)。为了END
确保最终的连续序列是/不是最长的,Raku 的Test??
True!!
False三元运算符用于输出put
最长的数组。第二个答案与第一个答案类似,只是
when
使用了语句。在 Raku 中,一旦when
满足条件,就会执行其关联的块,并且控制权将恢复到外部块,跳过任何后续的when
ordefault
语句。请参阅下面的参考。输入示例:
示例输出:
注意:如果出现平局,上面的代码将输出第一个最长的连续序列。
https://docs.raku.org/syntax/when
https://docs.raku.org/
https://raku.org
如果您不想过度设计,请尝试以下命令行:
awk
有关更多详细信息和摆弄,请查看和的手册页sort
。