1

我有一个 Perl 脚本,其中包含以下代码段:

@mylittlearray = split(/\/dir1\/dir2\//, `du --max-depth=1 \/dir1\/dir2\//`
print $mylittlearray[0];
print $mylittlearray[1];
print "\n";

输出是

24    ones
8

mylittlearray[0] 和 [1] 应该只返回 24 和"ones",而不是"ones8"。如果我将 du 命令传送到一个文件并在 VIM 中打开 set list,我会看到以下内容:

24^I./ones$
8^I./twos$

如果我du使用 a 运行命令-0,我会看到:

24      ./ones^@8       ./twos^@8       ./threes^@8     ./fours^@8      ./fives^@80     .^@

我试图弄清楚如何拆分这两种格式,以便将目录名称与下一个目录的大小分开或拆分。换句话说,我希望 mylittlearray[0] 等于 24,mylittlearray[1] 只包含"ones", mylittlearray[2] 将包含"8"等等。

关于如何做到这一点的任何想法?

4

2 回答 2

3

您的问题不太清楚,但如果您只是对从 收集每个结果条目的数据感兴趣,du请像这样遍历结果:

#!/usr/bin/perl
use strict;
use warnings;

# Capture the output from du
my @array = `du --max-depth=1 /some/folder/`;

# Loop over the output
foreach (@array)
{
    chomp; # Strip new-line
    my ($size, $dir) = split; # Split on whitespace
    print "Dir: $dir, Size: $size\n";
}
于 2013-04-02T18:56:06.920 回答
1

使用map而不是split

my $dir = "/dir1/dir2/";
my @mylittlearray = map { m!(\d+)\s+$dir(.*)! } `du --max-depth=1 '$dir'`;
print join(", ", @mylittlearray), "\n";
于 2013-04-02T21:53:36.367 回答