Вызов функции в Perl с разными свойствами - PullRequest
2 голосов
/ 21 января 2011

Я написал 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 ]

1 голос
/ 21 января 2011

На ум сразу приходят две мысли:

Создайте модуль Perl для вашего общего кода, а затем require или use модуль в соответствии с вашими потребностями. (Разница в основном в том, хотите ли вы запустить 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 голос
/ 21 января 2011

Вы можете сделать это, используя 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

Другие альтернативы:

  • передать определения как параметры командной строки непосредственно в engine.pl и оценить содержимое @ARGV
  • записать модуль perl , содержащий двигатель и useэтот модуль
  • сохраняет параметры в файле конфигурации и считывает их из вашего движка (например, используя Config :: IniFiles )
0 голосов
/ 21 января 2011

Я не уверен, в чем проблема, поэтому я немного догадываюсь. У вас есть код в разных местах, который одинаков каждый раз, за ​​исключением некоторых переменных. Это само определение подпрограммы.


Возможно, проблема в том, что вы не знаете, как включить общий код в эти различные сценарии. Это довольно просто: вы пишете этот код в модуле perl. В основном это файл, заканчивающийся pm вместо pl. Конечно, вы должны позаботиться о таких вещах, как экспорт ваших функций. Perldoc должен оказать большую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...