1

これを理解するのに約6時間費やしました。perlの達人が助けてくれることを願っています。

ループして、ポーリングしているサーバーに関する情報でハッシュを更新するプログラムがあります。HTTP::Server::Simple::CGI を使用して、この情報をユーザーに報告しています。HTTP::Server::Simple::CGI モジュールがハッシュの更新を認識せず、ハッシュが初期化されたデータのみを報告するという問題が発生しています。

要約すると、次のコードがあります。

{
package LabBrowser;

use warnings;
use strict;
use Thread::Queue;
use LWP::Simple; 
use HTTP::Server::Simple::CGI;
use base qw(HTTP::Server::Simple::CGI);

my %problem_data_structure;


sub server_loop {
    while(1) {
        for my $server (@server_list) {
            fetch_server_info(@$server);
        }
    }
}

sub fetch_server_info {
    my ($hostname, $port) = @_; 
    my $content = fetch_webpage_content("http://" . $hostname . ":" . $port);   
    my @data = parse_data(content);
    $problem_data_structure{$hostname} = [@data];
}

##THIS SUB
sub handle_request {
    my ($self, $cgi) = @_;
    my $path = $cgi->path_info();

    ##THIS LINE 
    print Data::Dumper->Dump([\%problem_data_structure],['handle']);

}

}

my $pid = LabBrowser->new(8080)->background();
my $labBrowser = LabBrowser->init();
$labBrowser->server_loop();
print "$pid !!!\n";

handle_request を除いて、プログラムのどこでも %problem_data_structure のデータを取得できます。そこでは、変数が初期化されたものだけを知っているようです。最初にいくつかのキーと値のペアを追加すると、それが報告されます。ただし、初期化以降にデータ構造に追加されたものは報告されません。

誰が何が起こっているのか知っていますか?

4

1 に答える 1

1

これbackground()は、リクエストがバックグラウンド プロセスで処理されていることを示しています。Perl のプロセスはメモリを共有しないため、%problem_data_structureで が変更されても、親プロセスhandle_requestの の (元の) コピーは影響を受けません。%problem_data_structure

于 2012-05-10T00:52:40.483 に答える