Как решить "Использование неинициализированного значения $ 2 в конкатенации (.) или строка в" - PullRequest
0 голосов
/ 01 октября 2018

Ниже мой код.Я хочу напечатать данные $ 1 и $ 2 в одну строку и разделить их на ,.Почему я не могу распечатать данные?

#!/usr/intel/bin/perl

use strict;
use warnings;

use IO::Uncompress::Gunzip qw(gunzip $GunzipError);

my $input = "par_disp_fabric.all_max_lowvcc_qor.rpt.gz";
my $output = "par_disp_fabric.all_max_lowvcc_qor.txt";

gunzip $input => $output
or die "gunzip failed: $GunzipError\n";

open (FILE, '<',"$output") or die "Cannot open $output\n";

while (<FILE>) {
  my $line = $_;
  chomp ($line);

  if ($line =~ m/^\s+Timing Path Group \'(\S+)\'/) {
    $line = $1;

    if ($line =~ m/^\s+Levels of Logic:\s+(\S+)/) {
      $line = $2;
    }
  }
  print "$1,$2\n";
}

close (FILE);

1 Ответ

0 голосов
/ 01 октября 2018

Суть вашей программы здесь:

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...
      }
    }
    
...