Суть вашей программы здесь:
if ($line =~ m/^\s+Timing Path Group \'(\S+)\'/) {
$line = $1;
if ($line =~ m/^\s+Levels of Logic:\s+(\S+)/) {
$line = $2;
}
}
Переменные захвата регулярного выражения ($1
, $2
и т. Д.) Устанавливаются, когда вы сопоставляете строку с регулярным выражением, содержащим наборы захватаскобки.Первые круглые скобки захвата устанавливают значение $1
, вторые круглые скобки захвата устанавливают значение $2
и так далее.Чтобы $2
было присвоено значение, необходимо сопоставить регулярное выражение, содержащее два набора круглых скобок.
Оба ваших регулярных выражения содержат только один набор круглых скобок.Поэтому только $1
будет установлен на каждом из ваших матчей.$2
никогда не будет присвоено значение, что приведет к предупреждению, которое вы видите.
Вам необходимо переосмыслить логику в своем коде.Я не уверен, почему вы думаете, что $2
будет иметь значение здесь.Ваш код немного сбивает с толку, поэтому я не могу предложить более конкретное решение.
Однако могу дать вам более общий совет:
Использованиелексические файловые дескрипторы и версия с тремя аргументами open()
.
open my $fh, '<', "$output"
Нет необходимости в кавычках вокруг $output
.
open my $fh, '<', $output
Я знаю, почему вы это делаете, но $output
- это потенциально запутанное имя для файла, из которого вы читаете.Попробуйте изменить его.
Всегда включайте $!
в сообщение об ошибке open()
.
open my $fh, '<', $output or die "Cannot open '$output': $!\n";
Кажется, ваша переменная $line
кажетсяненужным.Почему бы просто не сохранить данные строки в $_
, что упростит ваш код:
while (<$fh>) {
chomp; # works on $_ by default
if (/some regex/) { # works on $_ by default
# etc...
}
}