在Perl中调用具有不同属性的函数

时间:2011-01-21 07:36:13

标签: perl function module net-snmp

我编写了一个Perl脚本,可以启动SNMP会话并将数据/计数器及其值提取到csv文件中。有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();

3 个答案:

答案 0 :(得分:1)

立即想到两个想法:

Build a Perl module代表您的公共代码,然后根据您的需要requireuse模块。 (差异主要在于您是要运行LynxLee::run_servers()还是run_servers() - 您是否希望模块影响当前范围。)

使用符号链接:创建这些符号链接:retrieve_mibs1.pl - > retrieve_mibs.pl retrieve_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引用并不擅长。 :)

答案 1 :(得分:1)

您可以使用eval执行此操作:在一个文件中设置变量,然后打开引擎并评估其内容。

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

其他替代方案是:

答案 2 :(得分:0)

我不确定问题是什么,所以我猜一点。每次为某些变量保存时,您在各个地方都有相同的代码。这是子程序的定义。


问题可能是您不知道如何在这些不同的脚本中包含公共代码。这很简单:您在perl模块中编写该代码。这基本上是以pm而不是pl结尾的文件。当然,你必须处理一些事情,比如导出你的功能。 Perldoc应该会有很大的帮助。