メッセージと標準入力からのコマンドとを受け付けるエージェント
#!/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 されたことを示すという規約に基づいている。 ここではどちらの場合も、エージェントの停止を示すとしている。