3

更新されたデータをファイルからリモート サーバーに定期的に送信する perl プログラムを作成しました。しかし、今では、受信者が混合データからデータを分離する方法を知る必要があるように、異なるファイルからそれを読み取り、更新されたデータを送信する必要があります。ある種の区切り記号を入れる必要がありますか?そのようなものに対する基準はすでにありますか?

#############
#Change parameters
############
$PeerAddr='192.168.0.7';
$PeerPort='7070';
##############
# Import packages
##############
use Text::Diff;
use IO::Socket;
#############
# Define global variables
#############
$lineCount=0;
$loopCount=0;
our $stats2 = 0;
for($count = 0; $count <= 10000; $count++){
        my $data_dir="archive/otat/*dat";
        my $data_file= `ls -t $data_dir | head -1`;
        chomp($changed_data_file);
        print "old data_file is $changed_data_file \n";
        chomp($data_file);
        if($data_file ne $changed_data_file){
                $lineCount2=0;
                $changed_data_file=$data_file;
                print ("String:$data_file :$changed_data_file  are not equal\n");
                }
        while(defined($data_file)){
                print "$data_file \n";
                open (DAT,$data_file) || die("Could not open file! $!");
                @iofile = <DAT>;
                $lineCount = @iofile;
                splice(@diffLines);
                print "printing: $lineCount\n";
                print "printing 2: $lineCount2 \n";
                chomp $lineCount;
                chomp $lineCount2;
                if($lineCount != $lineCount2){
                        $j=0;
                        for($i=$lineCount2;$i <= $lineCount; $i++){
                        $diffLines[$j] = $iofile[$i];
                                $j++;
                }
                        $num=@diffLines;
                        print "count of diff lines:$num\n";
                        $lineCount2 = $lineCount;
                        $loopCount=0;
                }
                if($loopCount>2){
                        $loopCount=0;
                        print "Look for recent file \n";
                        last;
                }
                $loopCount++;
                sleep(5);
############################
                &socket_con(@diffLines);
        }

}
#### Methods/Functions
sub socket_con {
        if ($sock== 0){
                $sock = new IO::Socket::INET (
                                                        PeerAddr => $PeerAddr,
                                                        PeerPort => $PeerPort,
                                                        Proto => 'tcp'
                                                        );
                die "Could not create socket: $!\n" unless $sock;
        }
        print $sock @_;
#close($sock);
}
4

1 に答える 1

1

私はJSONをよく使って良い結果を得ましたhttp://metacpan.org/pod/JSON データをハッシュに保存し、シリアル化し、テキストをクライアントに送信し、文字列をPerlハッシュに戻すことができます簡単に使用できます。例えば:

# on the server
use JSON;
...
# store changed lines in a hash
$diffLines->{$data_file}[$j]=$io_file[$i];
...
# Serialize the hash reference into a string which you then send to the client
$diffLinesSerialized = encode_json $diffLines;

# on the clinet
use JSON;
...
# convert received data from serialized string into hash
$diffLines = decode_json $diffLinesSerialized;
# $diffLines is now a has reference which can be accessed like normal
foreach my $data_file (keys %$diffLines) {
  foreach my $line (@{$diffLines->{$data_file}}) {
    ...
  }
}

以上のことから、私はプログラミングの観点から XML があまり好きではありませんが、XML はこの種の一般的な標準です。これが単なる専門的な内部ツールであり、大規模なものに成長しない場合は、おそらく問題にはなりませんが、これがより一般的なサービス、たとえば非 perl クライアント向けのものになる可能性があると考える場合は、検討することをお勧めします。オプションとして XML。サービス指向の観点からプログラミングを行うと、将来的に物事を成長させることが容易になります。

于 2012-09-23T20:42:32.760 に答える