如何在Perl中打印匹配的下一行?

时间:2017-07-27 21:10:51

标签: perl

所以,我编写了一个脚本来计算4 ^(0)到4 ^(10)的阶乘,因为我想测试运行时间,我还想比较斯特林的近似值和实际的实际数量。各个阶乘的数字。

所以我有一个名为factorials.txt的数据文件 其中包含以下数据:

The factorial of 1 is
1
The factorial of 4 is
24
The factorial of 16 is
20922789888000
The factorial of 64 is
126886932185884164103433389335161480802865516174545192198801894375214704230400000000000000

我希望factorials的输出如下:

Factorial 1: 1 digits.

Factorial 4: 2 digits.

Factorial 16: 14 digits.

Factorial 64: 90 digits

我能够编写一个脚本来获取这些值,其中我的___阶乘的声明是......在下一行是因子的值。但是我无法在匹配后选择下一行,所以我使用while循环通过文件匹配写了不存在的字母,然后在行上打印字符的长度。它有效,但我不认为它非常有效。

#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';

my $file = 'factorials.txt';
my $filehandle;
open($filehandle, '<', $file) or die "Could not open file $_ because $!";

while(my $line = <$filehandle>)
{
chomp $line;
my $index = $.;
        if($line !~ m/[a-z]/)
        {
                say length($line);
        }

}

我的脚本输出以下内容,例如:

1
2
14
90

我希望解析脚本与行上的“factorial”匹配,打印下一行的字符长度。我相信这一定是可能的,但我似乎无法弄清楚如何进入下一行。

有什么想法吗?非常感谢!

1 个答案:

答案 0 :(得分:3)

整件事情可能比这简单得多。您只需要一个特定的匹配。

以下代码将检查带有您构建阶乘的数字的文本。如果发现,那么print是标签。它通过将数字捕获到$1来实现。 print没有换行符。

如果找不到它,则假定整行是具有阶乘的那一行,因此它say是该行的length。现在这将有换行符,下一个输出将转到下一行。

chomplength正常工作非常重要。

use strict;
use warnings;
use feature 'say';

while (my $line = <DATA>) {
    chomp $line;
    if ( $line =~ m/factorial of ([0-9]+)/) {
        print "Factorial of $1: ";
    } else {
        say length $line;
    }
}

__DATA__
The factorial of 1 is
1
The factorial of 4 is
24
The factorial of 16 is
20922789888000
The factorial of 64 is
126886932185884164103433389335161480802865516174545192198801894375214704230400000000000000

输出:

Factorial of 1: 1
Factorial of 4: 2
Factorial of 16: 14
Factorial of 64: 90