例のLime用Perlマクロの裏技
これのおかげでPerlが分かるようになりました!!(27歳主婦)
このDLL、複数行を出力するマクロを組むには少し工夫が必要です。例えば
print "ヒヒッ\n"; print "アヒャーッ";
こんなスクリプトを書いて、マクロに組み込むと一行目の「ヒヒッ」は出力されるけど、2行目は「そんなコマンドはねぇよ!」というメッセージが帰って来るだけで出力されません。
これは、IRCのコマンドが一行を一つの単位としているからなんだろうなあと予想。
そこで…
print "ヒヒッ\n"; print "notice #macrotest アヒャーッ";
こうしてみました。
一行目はDLLの機能かなんかで、自動的にコマンドとチャンネル名が入るようになっている。ならば二行目以降は手動でコマンドを書いてやればちゃんと動くんじゃないか!? という理屈。
で、結果は…ちゃんと動きました! これは発見ですぞー
けれども このままだと、二行目は#macrotestにしか送れないマヌケマクロになります。DLLの配布元の例のままマクロを組み立てると、マクロがどのチャンネルで実行されたかをPerlのスクリプトの中で参照出来ません。しかし、そこはこのDLLのシンプル構造を利用して解決できるのですね('A`)b
配布元の例だと動作の情報が、
$DllString(limePerl.dll,getIRCmessage,Macro\File\macro.pl %m)
こうなっています。
%mってのはメッセージ本体ですね…。さらにここでDLできるサンプルを見比べながらよく見ると、「Macro\File\macro.pl %m」の部分はコマンドラインになってる様子! ということは…
$DllString(limePerl.dll,getIRCmessage,Macro\File\macro.pl %f "%m")
こうしてはどうか!? %fは、マクロが実行されたチャンネルの名前に置き換えられます。
ついでに、メッセージの本体%mをダブルクォートでくくりました。こうすると、メッセージに半角スペースが含まれている時に、それがコマンドの区切りと誤認識されるのを防ぐ事が出来ます。
んで、スクリプトの内容を
my $ch = $ARGV[0]; #チャンネル名を取得 my $message = $ARGV[1]; #メッセージの内容を取得 print "ヒヒッ\n"; print "notice $ch アヒャーッ$messageだって!";
こんな風に書き換える。最初の二行で、動作の情報に含まれる%fと%mを変数に代入して、その内容を最後の二行の各所に使っているわけです。どうでもいいけど出力内容がただのバカみたいだな。
実際この方法でマクロを作ってみたところ、大成功。素晴らしいね。だけどたくさんの発言を同時にするわけだから、あんまり調子に乗るとウザい事この上ない危険がある諸刃の刃。ご利用は計画的に!