2017-07-27 9 views
0

私はランタイムをテストしたいので、4 ^(0)〜4 ^(10)の階乗を計算するスクリプトを書いています。また、Stirlingの近似値と実際の桁数それぞれの階乗のPerlで次の行の印刷方法は?

Factorial 1: 1 digits. 

Factorial 4: 2 digits. 

Factorial 16: 14 digits. 

Factorial 64: 90 digits 
次のように私は階乗の出力を希望

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.txtと呼ばれるこのデータを使用してファイルを持っています

私はこれらの値を取得するためのスクリプトを書くことができました。___の階乗についての私のステートメントの後には、次の行で階乗の値が入ります。しかし、私は試合後の次の行を選択することができませんでした。だから、私はこれを、文字の存在しないファイルの照合の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 == 2){$ line;}と書くと、改行で2行目が表示されます。しかし、一致する行に応じてインデックスをインクリメントする方法はわかりません。 – xyz123

+0

私はそれを得るのか分かりません - 最初に表示されたファイルを処理したいので、 'factorial of N is'行に桁数を追加しますが、結果には次の行を入れますか? – zdim

答えて

3

すべてのことがそれよりはるかに簡単です。あなたが必要とするのは、特定のマッチの1つだけです。

次のコードは、階乗を構築した番号のテキストをチェックします。見つかった場合は、ラベルprintです。番号を$1に取り込むことでそれを行います。 printに改行はありません。

見つからない場合は、行全体が階乗であるとみなされますので、行のlengthsayです。これで改行が行われ、次の出力は次の行に移動します。

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 $に' $ line; 'を追加する) – zdim

+0

多分私は私が何を言おうとしているのかを伝えるのは苦労している。しかし、simbabqueは私の質問に示されているように期待通りの結果を得ています。 – xyz123

+0

私は読者のためにそれを残すつもりです。@zdim – simbabque

関連する問題