1

私は Munin-Pluging を書いており、telnet セッションからの画面出力をキャプチャするのが好きです。このようなセッションの出力は次のようになります。

...
    0x00017   0x41b3f340  BPING                       0           0         0            0         198          132            330             
    0x00018   0x41b47340  CHKFAILED                   0           0         0            0         198          132            330             
    0x00026   0x41b4f340  CIP                         0           0         0            0         370          264            634             
    0x0001e   0x41b57340  CONTROL                     0           1         0            0         3876         2178           6054            
    0x01014   0x41b5f340  UNETSRVR                    0           0         0            1         296          198            494             
    0x00037   0x41b67340  ----                        0           0         0            0         198          132            330             
    0x00000   0x43b67450  ----                        0           0         0            0         0            0              0               
    0x00000   0x4bb67450  ----                        0           0         0            0         5084         4224           9308            
    0x00000   0x49367450  ----                        0           0         0            0         14742        4158           18900           
    -------------------------------------------------------------------------------------------
                                            SUMMARY : 2           40        5            7         4898229      2728176        7626405    

このスクリプトは、画面の内容を配列 (@lines) に抽出します。

#!/usr/bin/perl

use Net::Telnet ();
use strict;
use warnings;


my $t = new Net::Telnet (Timeout => 10);

$t->port(777);
$t->open("192.168.0.1");

$t->buffer_empty;
my @lines = $t->waitfor(match =>"m/.* SUMMARY : .* \n/");

my @gagu = grep { "$_" =~ /^.*BPING.*\n/ } @lines;

print @gagu;
  • 配列 @lines はどの型ですか?
  • フィルタリングされた行ではなく、常にコンテンツ全体を grep から取得するのはなぜですか?
  • net:telnet から取得した配列は、他の配列とは異なりますか?

はい、Perl は初めてです。

4

1 に答える 1

1

私はこのモジュールとその機能に精通していませんが、あなたが述べたものと同様のある種の戻り値を提供すると思います。

配列内のすべての行を取得している場合は@gagu、配列内のデータが@lines1行のみで構成されているか、grep失敗している可能性があります。

たとえば、@lines次の文字列を含めることができます。

"foo   bar    baz\nfoo1   bar1   baz1\n";

あなたが期待するようにではなく

"foo   bar    baz\n";
"foo1  bar1   baz1\n";

grepステートメントはおそらく期待どおりに機能しますが、次のことを検討することをお勧めします。

  • 引用し$_ないでください。それは目的を果たさないからです。
  • まったく使用$_していません。これはデフォルトの変数であるため、使用する必要はありません(明確さを除いて)。
  • アンカー^\nは冗長であるため、使用しません。

たとえば^.*、どこでも、任意の文字列に一致します。文字列を単純に照合するためにそれを使用することは冗長です。正規表現をで終了するの.*\nは冗長です。これは、「改行が見つかるまで、改行以外のすべての文字と一致する」とだけ書かれているためです。あなたが改行を持っていると仮定すると、それは何もしません。そうしないと仮定すると、それはあなたに偽陰性を与えます。この試合に必要なのは/BPING/。したがって、コードは次のようになります。

use Data::Dumper;
my @lines = $t->waitfor(match =>"m/ SUMMARY :/");
my @gagu = grep /BPING/, @lines;

print Dumper \@gagu;

空白が目に見える形で印刷されていることを確認したい場合は、$Data::Dumper::Useqq変数を使用できます。

$Data::Dumper::Useqq = 1;
print Dumper \@gagu;

変数の印刷は非常に優れたデバッグツールです。

于 2012-12-03T16:15:32.777 に答える