Почему идентификатор процесса изменяется в выводе «ps -l»?

Perl может сделать это легко, используя хэш:

#!/usr/bin/env perl

use strict;
use warnings;

my %stuff;
my @header = split ' ', <>;

#read in the data to "stuff"
while ( <> ) { 
   my ( $key, $value ) = split; 
   push ( @{$stuff{$key}}, $value ); 
}

print join ("\t", @header ),"\n"; 
foreach my $key ( sort keys %stuff ) {
   print $key, "\t", join ";", @{$stuff{$key}},"\n";
}

Вывод:

A   B
123 fvv;kjf;ccd;
567 abc;abc;
879 ttt;

Где вы ошиблись? Честно говоря, я бы посоветовал попытаться сжать все это в один слой. Это, на мой взгляд, очень плохая практика. В лучшем случае он продвигает непостижимый код, за которым трудно следовать.

Вышесказанное можно было бы сократить, но действительно стоит сделать это сначала от руки.

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

Это работает, но на выходе получается, что отступы не выровнены аккуратно:

#!/usr/bin/env perl

use strict;
use warnings;

my %stuff; 

my ( $id, @header ) = split ' ', <>;

while ( <> ) { 
   my ( $key, @values ) = split; 
   my %row;
   @row{@header} = @values; 
   push ( @{$stuff{$key}{$_}}, $row{$_} ) for keys %row;
}

print join ( "\t", $id, @header),"\n";
foreach my $key ( sort keys %stuff ) {
   print join ("\t", $key, map { join ";", @{$stuff{$key}{$_}}} @header), "\n";
}

Результат:

A   B   C
123 fvv;kjf;ccd ggg;ggg;att
567 abc;abc gst;hgt
879 ttt tyt

Если разделение табуляции не подходит для ваших нужд, вы можете использовать sprintf для выполнения форматирование:

my $format = '%12s';
print map { sprintf($format, $_) } ( $id, @header),"\n";
foreach my $key ( sort keys %stuff ) {   
   print map { sprintf($format, $_) } ( $key, map { join ";", @{$stuff{$key}{$_}}} @header),"\n";
}

Здесь мы используем карту , что, как я понимаю, не совсем очевидная вещь.

Он берет список и применяет преобразование к каждому элементу. Итак - в приведенном выше примере:

print join ("\y", map { join ";", @$_ } ([1,2,3],[4,5,6],[7,8,9]) )

Будет сгенерировано:

1;2;3   4;5;6   7;8;9

Операция map говорит «присоединиться к каждому подмассиву на;» а затем вернуть это как список ... который мы затем можем присоединить с помощью вкладки. Это в основном то, что делает вышеупомянутое.

-1
25.03.2019, 20:02
2 ответа

Каждый новый процесс (и каждый новый экземпляр программы с тем же именем )имеет новый идентификатор процесса.

PID является целым числом, и когда оно достигает своего максимального значения, оно возвращается к 1. Значение PID (число )уникально для любого момента времени.

3
28.01.2020, 05:07

Pid -— идентификатор процесса. Ppid -— идентификатор родительского процесса. Когда вы запускаете свою программу, она получает свой собственный pid, поэтому pid меняется, когда вы запускаете программу несколько раз. Ppid не меняется, так как родительский процесс для программы является терминальным, из которого вы запускали программы

Может родитель не терминальный, но у ваших программ один родитель на всех, и поэтому ppid не меняется

0
28.01.2020, 05:07

Теги

Похожие вопросы