0

ここに私の生データのスニペットがあります:

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
     1 root      16   0  2160  604  520 S  0.0  0.1   0:01.60 init               
     2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 migration/0        
     3 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0        
     4 root      10  -5     0    0    0 S  0.0  0.0   0:00.39 events/0           
     5 root      12  -5     0    0    0 S  0.0  0.0   0:00.00 khelper            
     6 root      14  -5     0    0    0 S  0.0  0.0   0:00.00 kthread            
     9 root      10  -5     0    0    0 S  0.0  0.0   0:00.36 kblockd/0          
    10 root      20  -5     0    0    0 S  0.0  0.0   0:00.00 kacpid             
   174 root      14  -5     0    0    0 S  0.0  0.0   0:00.00 cqueue/0           
   177 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 khubd              

左の列の先頭に空白があることに注意してください。このデータの各列を独自の配列に分割したいと考えています。この先頭の空白は、分割機能を使用するときに問題を引き起こしています。

私はこれを使用しています:

foreach my $line (@data) {
    my @column = split(/\s+/,$line);
    chomp (@column);
    print "$column[0]\n";

}

すべての要素を印刷するときに発生させたいのcolumn[0]は、すべての PID 番号をスペースなしで印刷することです。印刷column[1]すると、すべてのユーザーがスペースなしで印刷されます。列が正しく揃えられているため、すべてが台無しになっています。

ありがとう。

4

3 に答える 3

5

これは非常に一般的な必要性であるため、特別な分割呼び出しsplit(' ', ...)(それ以外は と同じsplit(/\s+/, ...)) は先頭の空白を破棄します。

末尾の空白はどちらでも破棄されるため、chomp は必要ありません。

于 2013-02-05T18:42:48.717 に答える
0

Miguel Prz に追加するために、配列の最初の要素がsplit(/\s+/,$line)を使用して空の値を返すという同様の問題がありました。パターン !/^$/.

#... 
my @column = grep {!/^$/} split(/\s+/,$line);
#...
于 2016-12-01T16:50:46.980 に答える
0

分割する前に $line の文字列を左にトリムします。

#... 
$line =~ s!^\s+!!;
my @column = split(/\s+/,$line);
#...
于 2013-02-05T18:38:45.347 に答える