2017-07-27 126 views
0

因此,我编写了一个脚本,用于计算4 ^(0)到4 ^(10)的阶乘因子,因为我想测试运行时间,并且我还想比较斯特林的近似值与实际的数字位数的各个阶乘。如何在Perl中打印匹配的下一行?

所以我有这个数据称为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 

我想阶乘的输出为以下几点:

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 

我想解析脚本,如果就行字“阶乘”匹配,打印下一行字符的长度。我相信这一定是可能的,但我似乎无法弄清楚如何去下一条线。

任何想法?非常感谢!

+0

你需要什么的'$ index'? – simbabque

+0

我认为这可能很有用,因为$ index是特殊变量“$”。包含行号。所以如果我打印if($ index == 2){say $ line;},它会打印第2行换行符。但我无法弄清楚如何根据它匹配的行增加索引。 – xyz123

+0

我不确定我是否得到了它 - 你是否想要处理开头显示的文件,所以要将数字的数字追加到'N is'的因子行,但在结果中保留以下行? – zdim

回答

3

整个事情可以比这更简单。所有你需要的是一个特定的比赛。

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

如果找不到它,它会假定整行是带有阶乘的那一行,所以它的行saylength。现在将有换行符,并且下一个输出将转到下一行。

chomp对于length正常工作很重要。

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 
+1

显然我们还需要重新打印结果行(所以在'else'中添加'say $ line;') – zdim

+0

也许我是很难传达我想说的话。然而,simbabque已经提供了我的问题所示的预期结果,这很好。 – xyz123

+0

我会给读者留下@zdim – simbabque

相关问题