如何将简单(平坦)数组转换为多维(2D)数组

3

我有以下Perl语言代码:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my $DF = "/usr/bin/df -Pk"; # HP-UX
my @temp = split /\n/, `$DF`;
shift @temp;
print Dumper \@temp;

以下是输出结果(为了更好的可读性,进行了缩短):
$VAR1 = [
          '/dev/vg00/lvol6       114224    46304    67920    41%     /home',
          '/dev/vg00/lvol7       8340704  4336752  4003952   52%     /opt',
          '/dev/vg00/lvol4       520952    35080   485872     7%     /tmp',
        ];

我希望将@temp数组转换为多维数组(数组的数组),格式如下:

$VAR1 = [
          ['/dev/vg00/lvol6', 114224, 46304, 67920, '41%', '/home'],
          ['/dev/vg00/lvol7', 8340704, 4336752, 4003952, '52%', '/opt'],
          ['/dev/vg00/lvol4', 520952, 35080, 485872, '7%', '/tmp'],
        ];

有人可以帮忙吗?提前感谢! :)

3
如果您在反引号捕获中使用数组,可以跳过基于换行符的分割:my @DF = \/usr/bin/df -Pk`。 - TLP
3
另外,如果你不想使用反引号,可以考虑以下替代方案:http://www.perlmonks.org/?node_id=177225 - TLP
@TLP:谢谢信息!但为了避免像这样的问题 Can't locate Filesys/DiskSpace.pm in @INC 和需要编译 Filesys::Df 模块,我依赖于系统的 df 命令。 - Szymon
据我所知,CPAN 工具负责编译和安装模块。你使用了 CPAN 工具吗? - TLP
@TLP:是的,但我没有访问HP-UX编译器。 :-/ - Szymon
2个回答

7
@temp = map [ split ], @temp ;

1
在@TLP的建议下工作:@temp = map [ split ], \$DF`` - RobEarl
谢谢你,我没有意识到如果只使用简单表达式就会发生别名现象,但如果这样做,map将有点毫无意义 :D - Peter R

1
这是我会做的方式。
my @lines = `$DF`;
my @data  = map { [split] } @lines;
print Dumper \@data;

假设路径中没有意外的空格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接