以下是我原始数据的摘录:
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]
时,它会打印所有没有空格的USERS。因为列是正确的,所以一切都搞砸了。
感谢。
答案 0 :(得分:4)
需要特殊的拆分调用split(' ', ...)
(否则与split(/\s+/, ...)
相同)丢弃前导空格。
任何一个都会丢弃尾随空格,因此不需要选择。
答案 1 :(得分:0)
在分割之前,将字符串修剪为$ line:
#...
$line =~ s!^\s+!!;
my @column = split(/\s+/,$line);
#...
答案 2 :(得分:0)
要添加到Miguel Prz,我遇到了类似的问题,其中数组的第一个元素使用 split(/ \ s + /,$ line)返回一个空值。这是我使用grep过滤空行的解决方案!/ ^ $ /。
#...
my @column = grep {!/^$/} split(/\s+/,$line);
#...