Входной файл для задания Perl

#perl #parsing

#perl #синтаксический анализ

Вопрос:

У меня есть простое пакетное задание, которое ищет пользователей в группе из Active Directory. Если количество пользователей превышает пороговое значение, отправляется электронное письмо. Я включил урезанную версию кода ниже, просто чтобы дать вам представление о том, чего я пытаюсь достичь. Мне нужна помощь в том, чтобы выяснить, как заполнить значения $ Group и $ t (в настоящее время жестко закодированные) значениями из другого файла. Не уверен, следует ли мне использовать простой файл журнала или xml, но в другом файле есть список имен групп и пороговое значение количества пользователей, которое мы должны иметь для каждой группы.

  • Security_Group_X 50
  • Security_Group_Y 40

Затем я хочу, чтобы это задание считывало эти значения из входного файла и выполняло big для каждого оператора. Не уверен, как должен быть отформатирован входной файл, и как проще всего прочитать файл, чтобы он обрабатывал приведенный ниже код для каждой группы в файле.

     my $Group = "Security_Group_X";
    Win32::NetAdmin::GetDomainController('',$Domain,$Server);

    if(! Win32::NetAdmin::GroupGetMembers($Server,$Group,@UserList)){
print "error connecting to group " . $Group;
    }
    else {
$i=0;
$t=50;

foreach $user (@UserList){
            $i  .
            print " $usern";
        }   
    print $i . " Current users in this group.n";

    if ($i > $t){
    ### i have some code here that would email the count and users ###
    }
    else { 
    print $Group . " is still under the limit. n";
    }
    }
  

Заранее спасибо за любой совет.

Ответ №1:

Вот мое решение:

Пример config.txt . Просто обычный файл с разделителями табуляции и двумя значениями в каждой строке:

  • Security_Group_X 50
  • Security_Group_Y 40

Пример кода:

 $CONFIGFILE = "config.txt";
open(CONFIGFILE) or die("Could not open log file.");
foreach $line (<CONFIGFILE>) {

@TempLine = split(/t/, $line);

 $GroupName = $TempLine[0];
 $LimitMax = $TempLine[1];

  # sample code from question (see question above) using the $GroupName and $LimitMax values
}
  

Ответ №2:

Я думаю, вы, возможно, хотите настроить файл конфигурации.

Посмотрите в разделе Config:: name-space на cpan.

Вот одно из возможных решений, основанное на Config::Auto. Я решил отформатировать файл конфигурации как YAML.

тестовая программа test.pl :

 #!/usr/bin/perl
use common::sense;

use Config::Auto;
use YAML;

my $config = Config::Auto::parse();

print YAML::Dump {config => $config};

my %groups = %{ $config->{groups} || {} };

print "n";

foreach my $group_name (sort keys %groups) {
    my $group_limit = $groups{$group_name};

    print "group name: $group_name has limit $group_limitn";
}
  

содержимое файла конфигурации test.config :

 ---
# Sample YAML config file
groups:
  Security_Group_X: 50
  Security_Group_Y: 40
  

Это приводит к:

 ---
config:
  groups:
    Security_Group_X: 50
    Security_Group_Y: 40

group name: Security_Group_X has limit 50
group name: Security_Group_Y has limit 40
  

Обновление: test.config с таким же успехом может содержать XML:

 <config>
  <!-- Sample XML config file -->
  <groups>
    <Security_Group_X>50</Security_Group_X>
    <Security_Group_Y>40</Security_Group_Y>
  </groups>
</config>
  

Комментарии:

1. Я не смог использовать конфигурацию или YAML. Думаю, этих pm не было в моем ящике. Я начал делать что-то немного более простое. Просто обычный текстовый файл с разделителями табуляции. Затем использовал разделение и присвоил каждому значению в строке его собственную переменную для использования.

2. Достаточно справедливо. Просто чтобы лучше ответить на вопрос, я также добавил XML-версию конфигурации к своему ответу. Если у вас есть XML::Simple доступный, вы могли бы загрузить его, а именно use XML::Simple; my $config = XMLin('test.config');