#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');