2

SNMPセッションを開始し、データ/カウンターとその値をcsvファイルに抽出するPerlスクリプトを作成しました。7つのperlスクリプトがあります。上部に異なるプロパティ/定義/変数がありますが、エンジンは同じです。

この時点で、これらの7つのperlスクリプトは、定義された変数を除いて冗長です。実行perlスクリプトをプロパティ/実行ファイルとして保持し、エンジンを別のファイルに保持する方法はありますか?このプロパティ/実行perlスクリプトは、エンジンを呼び出します(独自のスクリプトで定義されたプロパティを使用)。

つまり、変数を独自のスクリプトで(実行としても)使用したいのですが、統一された「エンジン」から特定の関数を呼び出します。

すなわち

retrieve_mibs1.pl retrieve_mibs2.pl retrieve_mibs3.pl retrieve_mibs4.pl retrieve_mibs5.pl retrieve_mibs6.pl retrieve_mibs7.pl

retrieve_mibs1.pl

#!/usr/local/bin/perl

use Net::SNMP;

##DEFINITION START

my @Servers = (
  'server1',
  'server2',
);

my $PORT = 161;

my $COMMUNITY = 'secret';

my $BASEOID = '1.2.3.4.5.6.7.8';

my $COUNTERS = [
  [11,'TotalIncomingFromPPH'],
  [12,'TotalFailedIncomingFromPPH'],
];

##ENGINE START
sub main {
  my $stamp = gmtime();
  my @oids = ();
  foreach my $counter (@$COUNTERS) {
    push @oids,("$BASEOID.$$counter[0].0");
  }
  foreach my $server (@Servers) {
    print "$stamp$SEPARATOR$server";
    my ($session,$error) = Net::SNMP->session(-version => 1,-hostname => $server,-port => $PORT,-community => $COMMUNITY);
    if ($session) {
      my $result = $session->get_request(-varbindlist => \@oids);
      if (defined $result) {
        foreach my $oid (@oids) {
          print $SEPARATOR,$result->{$oid};
        }
      } else {
        print STDERR "$stamp Request error: ",$session->error,"\n";
        print "$SEPARATOR-1" x scalar(@oids);
      }
    } else {
      print STDERR "$stamp Session error: $error\n";
      print "$SEPARATOR-1" x scalar(@oids);
    }
    print "\n";
  }
}
main();
4

3 に答える 3

1

2つの考えがすぐに思い浮かびます。

一般的なコード用requirePerlモジュールuseを作成してから、必要に応じてモジュールを作成します。(違いは主に、実行するLynxLee::run_servers()run_servers()、モジュールが現在のスコープに影響を与えるかどうかです。)

シンボリックリンクを使用します。次のシンボリックリンクを作成します。retrieve_mibs1.pl->retrieve_mibs.plretrieve_mibs2.pl-> retrieve_mibs.plなど、プログラム名に基づいて変数を設定します。

#!/usr/bin/perl -w

use File::Basename;

my $name = basename($0);

my @Servers, $PORT, $COMMUNITY, $BASEOID, $COUNTERS;

if($name ~= /retrieve_mibs1\.pl/) {
    @Servers = (
        'server1',
        'server2',
    );

    # ...
} elsif ($name ~= /retrieve_mibs2\.pl/) {
    @Servers = (
        'server3',
        'server4',
    );

    # ...
}

プログラムの名前を使用してハッシュにインデックスを付けてパラメーターを取得する方がはるかにクリーンですが、Perl参照はあまり得意ではありません。:)

于 2011-01-21T08:11:03.647 に答える
1

evalを使用してこれを行うことができます。1つのファイルに変数を設定してから、エンジンを開いてその内容を評価します。

variables.pl(変数を設定し、エンジンを呼び出します):

use warnings;
use strict;
use Carp;
use English '-no_match_vars';

require "engine.pl"; # so that we can call it's subs

# DEFINITION START
our $VAR1    = "Hello";
our $VAR2    = "World";

# CALL THE ENGINE
print "START ENGINE:\n";
engine(); # call engine
print "DONE\n";

engine.pl(実際の作業内容):

sub engine{
    print "INSIDE ENGINE\n";
    print "Var1: $VAR1\n";
    print "Var2: $VAR2\n";
}
1;  # return a true value

他の選択肢は次のとおりです。

  • 定義をコマンドラインパラメータとして直接に渡し、の内容engine.pl評価します@ARGV
  • エンジンとこのモジュールを含むperlモジュールを書くuse
  • パラメータを設定ファイルに保存し、エンジンから読み込みます(たとえば、Config :: IniFilesを使用)
于 2011-01-21T08:12:24.753 に答える
0

何が問題なのかわからないので少し推測します。いくつかの変数を除いて、毎回同じであるコードがさまざまな場所にあります。これはまさにサブルーチンの定義です。


おそらく問題は、これらのさまざまなスクリプトに共通のコードを含める方法がわからないことです。これはかなり簡単です。perlモジュールでそのコードを記述します。これは基本的に、のpm代わりにで終わるファイルですpl。もちろん、関数のエクスポートなど、さまざまなことに注意する必要があります。Perldocは大いに役立つはずです。

于 2011-01-21T08:09:40.497 に答える