所以,我编写了一个脚本来计算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”匹配,打印下一行的字符长度。我相信这一定是可能的,但我似乎无法弄清楚如何进入下一行。
有什么想法吗?非常感谢!
答案 0 :(得分:3)
整件事情可能比这简单得多。您只需要一个特定的匹配。
以下代码将检查带有您构建阶乘的数字的文本。如果发现,那么print
是标签。它通过将数字捕获到$1
来实现。 print
没有换行符。
如果找不到它,则假定整行是具有阶乘的那一行,因此它say
是该行的length
。现在这将有换行符,下一个输出将转到下一行。
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