Почему моя переменная Perl не имеет правильного значения вне блока if ()? - PullRequest
2 голосов
/ 28 октября 2010

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

use strict;
my %Hash = ();
my $logName = "MyLogName.Log";
open (LOG, '<', $logName) or die ("Couldn't open log ".$logName);

while (my $line = <LOG>) {
  chomp $line;
  if ($line =~ m/.*-t\s+(.+?),\s+(.+?)$/ix) {
    # This print statement shows that I have correctly extracted what I want.
    print ("Key::".$1."::Value::".$2."\n");
    my $key = $1;
    chomp $key;
    my $value = $2;
    chomp $value;
    $Hash{$key} = $value;

  }
}
close LOG;

#This shows the hash has been filled correctly. It shows all the keys and values
# I expect to see.
while ( (my $newkey, my @newvalue) = each %Tests) {
  print "Key##".$newkey."##NewValue:".$Tests{$newkey}."\n";
}

open (FILE, '<', "file.csv') or die ("Couldn't open csv file");

while (my $newLine = <FILE>) {
  chomp $newLine;
  if ($newLine =~ m/^(.+?),\s+(.+?)\s*?(.+?)$/ix) {
    #This print statment verifies I've captured them correctly
    print $1."::".$2."::".$3."\n";
    my $val1 = $1;
    my $val2 = $2;  #This is the same as the key in %Hash
    my $val3 = $3;
    #For good measure... 
    print $val1."::".$val2."::".$val3."\n";

    my $oldVal = $Hash{$val2};
    print "oldVal::".$Hash{$val2}." ";  #This line prints only the space
    print "\$oldVal::".$oldVal."\n";    #This line prints only the newline

    # Intent: put oldVal, val1, and val3 in an array and replace the old value
    # in %Hash with the array, so I'd have a hash of arrays. 
  }
}
close FILE;

Я использую Perl v5.10.1 в Cygwin.Операторы печати проверяют, что ключ, прочитанный из первого файла, идентичен ключу, считанному из второго файла;регулярное выражение выбрало именно то, что я хочу, чтобы они.Хеш глобален.Почему эти операторы print в конце не извлекают значение из хеша, если указан правильный ключ?

Ответы [ 3 ]

2 голосов
/ 28 октября 2010

Пройдите обычный процесс отладки.Убедитесь, что значения соответствуют вашим ожиданиям.

Убедитесь, что в хэше есть ключи и значения, которые, по вашему мнению, имеют:

 use Data::Dumper;

 print Dumper( \%Hash );

В вашем коде проверяйте значения на каждом шаге:

 if ($line2 =~ m/    ( )  ( )  ( )  /ix {
   my $key = $1;
   chomp $key;
   print "key is [$key]\n";
   my $value = $Hash{$key};
   print "value is [$value]\n";
   }

Могу поспорить, вы обнаружите, что значение $ установлено очень хорошо, поэтому ваша проблема в чем-то другом, например, в том, что $value имеет лексическую область, и вы ничего с этим не делаетепоэтому он исчезает в конце блока.Вы, вероятно, хотите присвоить это значение выше этого блока:

 my $value = do {
   if ($line2 =~ m/    ( )  ( )  ( )  /ix {
      my $key = $1;
      chomp $key;
      print "key is [$key]\n";
      $Hash{$key};
      }
   };

 print "value is [$value]\n";
2 голосов
/ 28 октября 2010

Вы, конечно, можете использовать переменные соответствия регулярного выражения в качестве ключей хеша. Нет никакой разницы между этими и другими строками. Если вам нужен более полный ответ, я предлагаю опубликовать ваши действительные регулярные выражения вместе с некоторыми примерами строк ввода, которые вызывают проблему.

0 голосов
/ 28 октября 2010
use strict;
use warnings;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...