2

数値推測ゲームのcgiスクリプトに取り組んでおり、読み取りと書き込みが可能なファイルにターゲット値を保存したいと考えています。その方法はわかりませんが、system()呼び出しを使用してそれを実行し、ある種の式を使用してそのファイルから値を抽出できると思います。その解決策を決定するのに助けが必要です。私はすでに次のものを持っています:

#!/usr/bin/perl -w
use CGI qw(:standard);
print header, start_html("Guessing Game"), h2("Guessing game"), "\n";

//need some type of system call to store value if one does not exist 
//or read it if it does (random value generated below)

srand( time() ^ ($$ + ($$ << 15)) );
my $target = int(rand 100) + 1; 

if ( !param() ) {
    print hr, "\n", start_form;
    print p("Try to guess a number between 1 and 100: ", textfield("guess")), "\n";
    print end_form, "\n", hr;
} else {
    print hr, "\n", start_form;
    my $guess = param("guess");
    if ($guess > $target) {
        print p ("$guess is too high; try again: ", textfield("guess")), "\n";
    } elsif ($guess < $target) {
        print p ("$guess is too low; try again: ", textfield("guess")), "\n";
    } else {
        print p ("You got it: $guess!");
        //erase value from file
    }
print end_form, "\n", hr;
}
print end_html, "\n";
4

2 に答える 2

3

値をフラット テキスト ファイルに格納することは確かに可能ですが、Web タイプの環境が直面する並行性の問題に留意する必要があります。最初の問題は、ユーザーごとにセッション ID が必要になることです。セッション ID は、多くの場合、隠しフィールドまたは Cookie でやり取りされます。どのマジック ナンバーがどのセッションに対応するかを識別できるように、そのセッション ID はこのフラット ファイルにターゲット番号と共に保存する必要があります。また、一定期間使用しない場合は、番号を削除する必要があります。これは大変な作業であり、複数のヒットが同時に発生するという問題に対処することさえできません。ファイルのロックなどに対処する必要があります。

はるかに健全なアプローチは、マジック ナンバーを隠しフィールドとして、または Cookie で単純にやり取りすることです。ただし、隠しフィールドの方がはるかに簡単です。そして、Crypt::Rijndaelなどのモジュールを使用して、マジック ナンバーを渡す前に暗号化し、受け取るときに復号化します。...それが実際に必要とするよりもはるかに多くのセキュリティのように思われる場合は、base64 エンコーディングなどの独自の戦略を考え出すことができます。軽量ですが、カジュアルな視聴者には十分です。

これにより、ユーザー セッションを追跡する必要がなくなります。各ユーザーは、推測フォームに埋め込まれた非表示フィールドの形式で独自のセッションを所有しています。

更新: CGI::Sessionは、ドライバーが指定されていない場合、デフォルトでセッション情報をフラット ファイルに保存します。これにより、並行性とセッション管理の詳細が抽象化されます。

于 2012-07-17T22:40:12.410 に答える
1

openを使用してファイルを開きます。

use strict;

# Get number
open(my $infh, '<', '/path/to/file') or die "Cannot open: $!";
my $number = <$infh>;
close($infh);
chomp($number); # removes newline, just in case

# Save number
open(my $outfh, '>', '/path/to/file') or die "Cannot open: $!";
print $outfh $number;
close($outfh);
于 2012-07-17T23:39:49.487 に答える