Perl: проблемы с ключами в хэше и регулярном выражении - PullRequest
0 голосов
/ 23 февраля 2012

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

Моя задача - прочитать 2 файла (базовый файл конфигурации и файл конфигурации).Оба файла могут иметь любое количество строк.Порядок строк не обязательно должен быть в последовательности.Мне нужно игнорировать вещи после "!"и "^".Тем не менее, я застрял на части игнорирования "!"и "^".Я могу сохранить каждую строку в ключах в хэше (без элементов после "!" Или "^"), но при сравнении я не получаю.

Например, если у меня есть строка "привет!"123 "в файле, мне нужно сохранить только" привет "в хэше и сравнить строку" привет "с другим ключом из другого хэша.Если в другом хеше есть ключ «привет», мне нужно распечатать его или поместить в другой хеш.Моя программа может поставить «hello» только из строки «hello! 123», но потерпела неудачу в части, когда она сравнивается с другим ключом в другом хэше.

Я проверил свое регулярное выражение, написав еще одну короткую программу, которая просто принимает пользовательский ввод и удаляет вещи после "!"и символы «^» и сравнить с другим ключом другого хэша.

Вот мой ошибочный код:

my %common=();
my %different=();
#open config file and load them into the config hash
open CONFIG_FILE, "< script/".$CONFIG_FILENAME or die;
my %config;
while (<CONFIG_FILE>) {
    chomp $_;
    $_ =~ s/(!.+)|(!.*)|(\^.+)|(\^.*)//;
    $config{$_}=$_;
    print "_: $_\n";
    #check if all the strings in BASE_CONFIG_FILE can be found in CONFIG_FILE
    $common{$_}=$_ if exists $base_config{$_};#stored the correct matches in %common
    $different{$_}=$_ unless exists $base_config{$_};#stored the different lines in %different
}
close(CONFIG_FILE);

У кого-нибудь была такая же проблема, как у меня раньше?Что вы делаете, чтобы решить это?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2012

Я не совсем уверен, в чем твоя проблема, Сакура, но я думаю, может быть, ты не находишь совпадений между $config и $base_config, когда нужно. Я подозреваю, что это может быть из-за пробелов в начале / конце, и предлагаю вам написать

while (<CONFIG_FILE>) {
  s/[!^].*//;           # Remove comments
  s/^\s+//;             # and clear leading
  s/\s+$//;             # and trailing whitespace
  next if length == 0;  # Ignore empty lines
  $config{$_} = $_;
  print "_: $_\n";
  if ( $base_config{$first} ) {
    $common{$first} = $first;
  }
  else {
    $different{$first} = $first;
  }
}

Вам также необходимо убедиться, что $base_config имеет такой же режим, прежде чем сравнивать его значения.

0 голосов
/ 23 февраля 2012
my %common=();
my %different=();
#open config file and load them into the config hash
open CONFIG_FILE, "<", "script/".$CONFIG_FILENAME or die;
my %config;
while (<CONFIG_FILE>) {
    chomp;

    my ($first,$last) = (split(\!| \^,$_,2);

    $config{$first}=$first;

    print "_: $first\n";

    #check if all the strings in BASE_CONFIG_FILE can be found in CONFIG_FILE
    if ( exists $base_config{$first} ) {
            $common{$first}=$first; #stored the correct matches in %common
    } else {
        $different{$first}=$first; #stored the different lines in %different
    }
}
close(CONFIG_FILE);

Это подход, который я бы выбрал - пожалуйста, обратите внимание, что код не тестировался, и я только что проснулся :) Возможно, вам придется исправить несколько вещей (около линии разделения, наверное, ...) идея верна.

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