Как объединить код, чтобы сделать вывод на одной строке? - PullRequest
0 голосов
/ 01 октября 2018

Можете ли вы помочь мне объединить обе эти программы для отображения вывода в строке с двумя столбцами?Первый столбец для $1, а второй столбец для $2.

Пожалуйста, помогите мне решить эту проблему.Спасибо:)

Это мой код 1.

#!/usr/local/bin/perl
#!/usr/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;
    print ("$1\n");
  }
}

close (FILE);

Это мой код 2.

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+Levels of Logic:\s+(\S+)/) {
     $line = $1;
     print ("$1\n");
  }
}

close (FILE);

Это мой вывод для кода 1, который содержит 26строка данных:

**async_default**
**clock_gating_default**
Ddia_link_clk
Ddib_link_clk
Ddic_link_clk
Ddid_link_clk
FEEDTHROUGH
INPUTS
Lclk
OUTPUTS
VISA_HIP_visa_tcss_2000
ckpll_npk_npkclk
clstr_fscan_scanclk_pulsegen
clstr_fscan_scanclk_pulsegen_notdiv
clstr_fscan_scanclk_wavegen
idvfreqA
idvfreqB
psf5_primclk
sb_nondet4tclk
sb_nondetl2tclk
sb_nondett2lclk
sbclk_nondet
sbclk_sa_det
stfclk_scan
tap4tclk
tapclk

Выходной код 1 также имеет такой же номер строки.

Ответы [ 3 ]

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

Чтобы объединить два сценария и вывести два элемента данных в одной строке, вам нужно подождать до конца файла (или до тех пор, пока у вас не появятся оба элемента данных), а затем вывести их сразу.Таким образом, вам нужно объединить обе петли в одну:

#!/usr/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";

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

    if ($line=~ m/^\s+Levels of Logic:\s+(\S+)/) {
        $levels = $1;
    }
    if ($line=~ m/^\s+Timing Path Group \'(\S+)\'/) {
        $timing = $1;
    }
}
print "$levels, $timing\n";

close (FILE);
0 голосов
/ 02 октября 2018

Вы все еще не дали нам одну важную информацию - как выглядят входные данные.Наиболее важно, две ли части информации, которые вы ищете, находятся в одной строке?

[ Обновление: Если присмотреться к вашим регулярным выражениям, я вижу, что это возможно для обеих частей информациибыть на одной линии - так как они оба должны быть первым элементом на линии.Было бы полезно, если бы вы прояснили этот вопрос в своем вопросе.]

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

#!/usr/bin/perl

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

my $zipped   = "par_disp_fabric.all_max_lowvcc_qor.rpt.gz";
my $unzipped = "par_disp_fabric.all_max_lowvcc_qor.txt";

gunzip $zipped => $unzipped
    or die "gunzip failed: $GunzipError\n";

open (my $fh, '<', $unzipped) or die "Cannot open '$unzipped': $!\n";

my ($levels, $timing);

while (<$fh>) {
    chomp;

    if (m/^\s+Levels of Logic:\s+(\S+)/) {
        $levels = $1;
    }
    if (m/^\s+Timing Path Group \'(\S+)\'/) {
        $timing = $1;
    }

    # If we have both values, then print them out and
    # set the variables to 'undef' for the next iteration
    if ($levels and $timing) {
        print "$levels, $timing\n";
        undef $levels;
        undef $timing;
    }
}

close ($fh);
0 голосов
/ 01 октября 2018

paste полезно для этого: предположим, что ваша оболочка - bash, затем используется подстановки процесса

paste <(perl script1.pl) <(perl script2.pl)

, который испускает столбцы, разделенные символом табуляции.Для более приятного вывода вы можете перенаправить вывод команды paste на column

paste <(perl script1.pl) <(perl script2.pl) | column -t -s $'\t'

И с этим вам не нужно пытаться "объединить" ваши Perl-программы.

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