2012-05-10 4 views
1

これを理解するのに約6時間を費やしました。私はPerlの達人が助けてくれることを願っています。ハッシュの更新はHTTP :: Server :: Simple :: CGIの呼び出しに反映されません

私は、ポーリングしているサーバーに関する情報でハッシュを更新するプログラムを持っています。私は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内のデータを取得することができます:

は、私は、次のコード、要約されています。そこでは、変数がどのように初期化されたかだけを知っているかのように見えます。最初にキーと値のペアを追加すると、それが報告されます。ただし、初期化以降、データ構造に追加されたものは報告されません。

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

+0

あなたは 'handle_request'をどのように呼び出しているかを示すコードを表示できますか? – keety

答えて

1

background()は、要求がバックグラウンドプロセスで処理されているという手掛かりです。 Perlのプロセスはメモリを共有しないので、%problem_data_structurehandle_requestに変更された場合、親プロセスの%problem_data_structureの(元の)コピーは影響を受けません。

+1

Great Scott!それでおしまい!わたしは、あなたを愛しています。私は、ドキュメンテーションにはそれがあると述べているにもかかわらず、別のプロセスがあるとは考えていませんでした。ブリー! paypalでビールを買えますか? – kheck

関連する問題