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

在拆分之前在 $line 处左修剪字符串:

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

为了添加到 Miguel Prz,我遇到了类似的问题,数组的第一个元素使用split(/\s+/,$line)返回了一个空值。这是我使用 grep 使用模式 !/^$/ 过滤空行的解决方案。

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