1

皆さんが光を当てるのを手伝ってくれることを望んでいた簡単な質問があります. perlを着実に学んでいます。

非常に大きな文字列があるとします。たとえば、次の出力を取得します。

our $z = `du -B MB /home`

これにより、次のような文字列が生成されます。

1MB     /home/debug/Music
1MB     /home/debug/Downloads
20MB    /home/debug
20MB    /home/

私が知りたいのは、この文字列を 2 列 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 を使用してディレクトリを null 値に置き換え、SPACE 値を 1 つの配列に設定し、スペース値を null にしてそれを 2 番目の配列に設定し、1 つの配列をキーとして設定できると思いますもう一方に。

これにアプローチする最良の方法について誰か提案がありますか?

どんな助けでも大歓迎です。

ありがとう、

ディエゴ

4

4 に答える 4

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];

}
于 2012-06-19T03:41:08.780 に答える
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、ハッシュが機能するかどうかを確認する必要があります。

于 2012-06-19T03:44:37.520 に答える
0

perl のベテランはこのソリューションをあまり気に入らないと思いますが、基本的には nix のルーツに解決しました。以前の for ループでこれに問題がありましたが、答えが文字列に格納されている限り、パイプを使用してシェル経由で評価できることに気付きました。

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);

配列 @a1 は最初の文字列の値を保持し、@a2 は 2 番目の文字列の値を保持します。

皆さんへの私の質問は、UNIX の「カット」ユーティリティに相当する perl はありますか? つまり、文字列出力を最初のタブ区切りフィールドに分割できる場所はどこですか? これは私が調査しなければならない問題です。

ディエゴ

于 2012-06-20T08:56:43.623 に答える
0

正直なところ、あなたが何を達成しようとしているのかわかりません。n 個の要素を持つ配列が必要なだけで、各要素が 2 つの列を持つ文字列である場合は、次のように調べる必要があります。

my @z1 = `du -B MB /home | tail -4`;

たとえば、ファイルの 3 行目にアクセスできます (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
于 2014-04-12T03:52:05.957 に答える