2017-07-27 60 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