2


1

シンプル:Perlではdoubleはどのように機能しますか?

perlで10進数がどのように機能するかについて非常に混乱しています。 intとdoubleの乗算に問題があります。 これは私が持っているものです:

sub timeEstimate(){
$number = shift;
print "Number: $number\n";
$stuff = sprintf("%d", $number * $number * $number) * .2045;
print "stuff: $stuff\n";
$totalDownloads = $stuff + ($number * $number) + $number;
print "totalDownloads: $totalDownloads\n";
$secondPerFile = .4464;
print "secondPerFile: $secondPerFile\n";
$totalSeconds = ($totalDownloads * $secondPerFile);
print "totalSeconds: $totalSeconds\n";
$totalHours = ($totalSeconds / 3600);
print "totalHours: $totalHours\n";
return $totalHours;
}

しかし、sprintfであっても、$ stuffを0以外にすることはできません。 誰かがシステムの仕組みを説明できますか?

UPDATE-Solved:愚かな自己責任のミスによる。 私は持っていた

use integer;

コードで。 headdesk

4 Answer


3


変数が宣言され、プロトタイプが関数から削除されると、コードは機能しているようです:

use warnings;
use strict;

sub timeEstimate {
    my $number = shift;
    print "Number: $number\n";

    my $stuff = sprintf("%d", $number * $number * $number) * .2045;
    print "stuff: $stuff\n";

    my $totalDownloads = $stuff + ($number * $number) + $number;
    print "totalDownloads: $totalDownloads\n";

    my $secondPerFile = .4464;
    print "secondPerFile: $secondPerFile\n";

    my $totalSeconds = ($totalDownloads * $secondPerFile);
    print "totalSeconds: $totalSeconds\n";

    my $totalHours = ($totalSeconds / 3600);
    print "totalHours: $totalHours\n";
    return $totalHours;
}

timeEstimate 10;


Number: 10
stuff: 204.5
totalDownloads: 314.5
secondPerFile: 0.4464
totalSeconds: 140.3928
totalHours: 0.038998

Perl関数では、 `my`キーワード(レキシカルスコープの変数を割り当てる)を使用して変数を宣言する必要があります。そうしないと、問題が発生します。 `警告を使用する;すべてのプログラムの先頭にあるstrict; `を使用すると、忘れることがなくなり、多くの有用な診断メッセージも提供されます。

timeEstimate`関数にある() `プロトタイプはエラーになっています。 `timeEstimate`関数は引数を受け入れないことを指定します。 Perlの関数プロトタイプを使用する必要がある理由が正確にわかるまで、Perlの関数プロトタイプを使用しないでください。

最後に、 `sprintf`を使用する必要はありません。 行は次のように書き換えられます。

my $stuff = 0.2045 * ($number ** 3);


1


あなたの問題はサブルーチンのプロトタイプにあります-あなたは空の引数リストを持っていますが、1つの引数でそれを呼び出しています。

timeEstimate($)にすれば大丈夫です。 次に、「timeEstimate(10)」などを呼び出します。

しかし、エラーメッセージを表示せずに実行する方法さえわかりません。


0


perl -e '$var = "0.123"; print sprintf("%02.5f\n", $var);'
0.12300

sprintfは10進数でも問題なく機能します。

編集する

また、 "use strict"を使用していないように見えます。これは、変数名のタイプミスに役立ちます。 そして、関数宣言から()を削除します。


0


質問のコードにはセマンティックエラーがあります。 あなたはそれを始めるべきです

sub timeEstimate {  # no parens!

引数を「timeEstimate」に渡すのを忘れていますか? として呼び出す

timeEstimate 3;

次のような出力が得られます。

Number: 3
stuff: 5.5215
totalDownloads: 17.5215
secondPerFile: 0.4464
totalSeconds: 7.8215976
totalHours: 0.002172666