Perl га sh неправильное управление функциями - PullRequest
0 голосов
/ 12 марта 2020

Я действительно борюсь с этим. Я не в состоянии понять отображение в ха sh ниже. Давайте использовать фиктивные данные:

MS Office    Version1    Obsolete    devicename
MS Office    version2    Active      devicename
Adobe        Version1    Obsolete    devicename
MS Office    Version1    Obsolete    devicename
Adobe        Version2    Active      devicename
Adobe        Version3    Active      devicename
MS Office    Version1    Obsolete    devicename
MS Office    version2    Active      devicename
Adobe        Version3    Active      devicename
Adobe        Version3    Active      devicename

Выше может быть в любом несортированном порядке (Devicename не используется, так как мне требуется только количество). Мне нужно отсортировать это и записать их в файл.

$count_app{$AppName}{$Ver}{$Stat}++;

foreach $App (sort keys %count_app) {
  $app_counts = $count_app{$App};
  foreach $Rating (sort keys %$app_counts) {
    $status_counts = $app_counts->{$Rating};
    foreach $Status (sort keys %$status_counts) {
      $count = $status_counts->{$Status};

      print "$Rating $App $Status and $count\n";
    }
  }
}

Выше приведена только функция ha sh, остальная часть кода здесь на самом деле не нужна, но в настоящее время она будет печатать данные отсортировано, как и ожидалось. Проблема в том, что я хочу напечатать его, чтобы он был уникальным для каждого статуса. Например:

Active:
     Adobe Version2 1
     Adobe Version3 3
     MS Office Version2 2
Obsolete
     Adobe Version1 1
     MS Office Version1 3

Таким образом, сортировка важна, но так же важна и сортировка. Однако я пробовал много способов, но большинство либо выдает мне синтаксические ошибки, либо при использовании %seen приложение будет использоваться только один раз, но затем пропускает другие соответствующие версии приложения.

Ответы [ 2 ]

3 голосов
/ 12 марта 2020

Если статус наиболее важен для вас, просто сделайте так, чтобы ключ на первом уровне имел значение ha sh.

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

my %app;

# Read data
while (<DATA>) {
  chomp;
  my ($name, $ver, $status) = unpack('A13A12A12');

  $app{$status}{$name}{$ver}++;
}

# Display data
for my $st (sort keys %app) {
  say "$st:";
  for my $nm (sort keys %{$app{$st}}) {
    for my $vr (sort keys %{$app{$st}{$nm}}) {
      say "\t$nm $vr $app{$st}{$nm}{$vr}";
    }
  }
}

__DATA__
MS Office    Version1    Obsolete    devicename
MS Office    version2    Active      devicename
Adobe        Version1    Obsolete    devicename
MS Office    Version1    Obsolete    devicename
Adobe        Version2    Active      devicename
Adobe        Version3    Active      devicename
MS Office    Version1    Obsolete    devicename
MS Office    version2    Active      devicename
Adobe        Version3    Active      devicename
Adobe        Version3    Active      devicename

. Выходные данные:

Active:
    Adobe Version2 1
    Adobe Version3 3
    MS Office version2 2
Obsolete:
    Adobe Version1 1
    MS Office Version1 3

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

3 голосов
/ 12 марта 2020

Perl функция map и grep весьма полезны для этого. map перебирает список и grep фильтрует список.

Попробуйте что-то вроде этого:

#! /usr/bin/perl

use strict;
use warnings;
use List::MoreUtils qw(uniq);

my @table = ();

while (<DATA>)
{
  chomp;
  my $row = [split /  +/];
  push @table, $row;
}

my @status = uniq map { ${$_}[2] } @table;

for my $s (@status)
{
  print "$s:\n";

  my @subset = map { [${$_}[0], ${$_}[1]] } grep { ${$_}[2] eq $s } @table;
  my @products = uniq map { ${$_}[0] } @subset;

  for my $p (@products)
  {
    print "  $p:\n";
    my @versions = map { ${$_}[1] } grep { ${$_}[0] eq $p } @subset;

    for my $v (uniq @versions)
    {
      my $count = grep { $_ eq $v } @versions;
      print "    $v: $count\n";
    }
  }
}

__DATA__
MS Office    Version1    Obsolete    devicename
MS Office    version2    Active      devicename
Adobe        Version1    Obsolete    devicename
MS Office    Version1    Obsolete    devicename
Adobe        Version2    Active      devicename
Adobe        Version3    Active      devicename
MS Office    Version1    Obsolete    devicename
MS Office    version2    Active      devicename
Adobe        Version3    Active      devicename
Adobe        Version3    Active      devicename

Создает следующий вывод:

Obsolete:
  MS Office:
    Version1: 3
  Adobe:
    Version1: 1
Active:
  MS Office:
    version2: 2
  Adobe:
    Version2: 1
    Version3: 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...