我有一个简单的问题,我希望你们能帮助解决问题。我正在稳步学习perl。
假设我有一个非常大的字符串,例如输出:
our $z = `du -B MB /home`
这将产生如下字符串:
1MB /home/debug/Music
1MB /home/debug/Downloads
20MB /home/debug
20MB /home/
我想知道的是,如何将此字符串加载到具有两列和n行的数组中(其中n是du输出中的行数)?
我正在尝试以下内容:
my $z1 = `du -B MB /home | tail -4`;
my @c0 = split (/n/, $z1);
my $z2 = join (/\t/, @c0);
my @c2=split(/\t/, $z2);
print @c2;
产生以下输出:
1MB/home/debug/Music1MB/home/debug/Downloads20MB/home/debug20MB/home
我想我可以使用替换函数s /// g来替换目录中的空值,并将SPACE值设置为一个数组,并将空格值置空并将其设置为第二个数组,并且可以设置1数组作为另一个的键。
有没有人对最佳解决方法有任何建议?
感谢任何帮助。
谢谢,
迭
答案 0 :(得分:1)
#!/usr/bin/perl;
my $z= `du -h -d 1 /home/*`;
my @array = split("\n",$z);
foreach my $ar(@array) {
my @ar = split("\t",$ar);
$ar = \@ar;
}
foreach my $entry(@array) {
print $entry->[0];
print $entry->[1];
}
答案 1 :(得分:1)
您可以尝试将它们存储在哈希中,如下所示:
#!/usr/bin/perl
use strict;
use warnings;
my $data = '1MB /home/work 4MB /user/bin';
my %values = split(' ', $data);
foreach my $k (keys %values) {
print "$k: $values{$k}\n";
}
exit 0;
请注意' '
作为split
的第一个参数将匹配任何空白字符(因此我们会充分利用它)。上面的输出应该是这样的:
1MB: /home/work
4MB: /user/bin
您必须将原始数据工作到$data
并检查散列是否适合您。
答案 2 :(得分:0)
我确信你们的老兵们不会喜欢这个解决方案,但我基本上已经解决了我的nix根源。我之前在for循环中遇到了麻烦,但我意识到我可以通过shell来评估管道,只要答案存储在一个字符串中。
my $z1; my $z2;
$z1 = `du -B MB /home | cut -f1`
$z2 = `du -B MB /home | cut -f2`
my @a1; my @a2;
@a1 = split("\n", $z1);
@a2 = split("\n", $z2);
Array @ a1保存第一个字符串的值,@ a2保存第二个字符串的值。
我向你们提出的问题是,是否有一个与unix“cut”实用程序等效的perl?即在哪里我可以将字符串输出拆分为第一个制表符分隔的字段?这是我必须探讨的问题。
迭
答案 3 :(得分:0)
老实说,我不确定你要完成什么。如果你只想拥有一个包含n个元素的数组,每个元素都是一个包含两列的字符串,你需要看起来不比
my @z1 = `du -B MB /home | tail -4`;
例如,可以访问文件的第三行(记住perl数组是从0开始的):
print $z1[2];
产生输出
20MB /home/debug
更有用的是在散列中捕获每个目录的大小:
my %dir2size;
foreach (@z1) {
my @line = split /\s+/;
$dir2size{$line[1]} = $line[0];
}
foreach my $key (sort keys %dir2size) {
print "$key: $dir2size{$key}\n";
}
产生输出
/home/: 20MB
/home/debug: 20MB
/home/debug/Downloads: 1MB
/home/debug/Music: 1MB