#!/usr/local/bin/perl5 use GlueLogic; &GlueLogicParseArgs(); &GlueLogicConnect("agent#", undef, "foobar"); &GlueLogicAccess("$GlueLogicAnchor.IN=UNBOUND", "$GlueLogicAnchor.OUT=UNBOUND"); &GlueLogicAccess("!AddInformTo $GlueLogicAnchor.IN $GlueLogicAgent/BINDING"); while (1){ &GlueLogicWaitForMessage() unless ( @GlueLogicMessageQueue || @GlueLogicStdinQueue ); &GlueLogicEnqueueMessage(); if ( @GlueLogicMessageQueue ) { last unless defined ( $_ = shift(@GlueLogicMessageQueue) ); next unless ( $_ eq "Changed $GlueLogicAnchor.IN" ); ( $_ ) = &GlueLogicAccess( "$GlueLogicAnchor.IN?" ); ( $vv, $v, $a ) = /^[^=]+=(.(\S+))\s*(.*)$/o; if ( $vv eq 'UNBOUND' ) { &GlueLogicAccess( "$GlueLogicAnchor.OUT=UNBOUND" ); next; } $OUT = "Unknown Message Selector"; if ( $v eq 'a' ) { $OUT = &ProcessMessageA ($a); } elsif ( $v eq 'bb' ) { $OUT = &ProcessMessageBB($a); } elsif ( $v eq 'zzz' ) { last; } &GlueLogicAccess( "$GlueLogicAnchor.OUT=\"$OUT" ); } elsif ( @GlueLogicStdinQueue ) { last unless defined ( $_ = shift(@GlueLogicStdinQueue) ); next if /^\s*$/o; chop; ( $v, $a ) = /^(\S+)\s*(.*)$/o; $OUT = "Unknown Command"; if ( $v eq 'a' ) { $OUT = &ProcessCommandA ($a); } elsif ( $v eq 'bb' ) { $OUT = &ProcessCommandBB($a); } elsif ( $v eq 'zzz' ) { last; } print $OUT, "\n"; } } &GlueLogicAccess("!DelInformTo $GlueLogicAnchor.IN $GlueLogicAgent/BINDING"); &GlueLogicDisconnect(); exit 0;
標準入力からの入力行は、行末の改行文字を取り除かれないまま、 待ち行列 @GlueLogicStdinQueue に入れられる。 このため、空行が入力された場合でも、その要素の長さが 0 になることはない。
last unless defined ( $_ = shift(@GlueLogicStdinQueue) );は
last unless defined ( $_ = shift(@GlueLogicMessageQueue) );と全く同様(あるいは対称)で、 @GlueLogicStdinQueue 内の先頭の要素が undef であったら、 それは標準入力が close されたことを示すという規約に基づいている。 ここではどちらの場合も、エージェントの停止を示すとしている。