1

以下の形式でデータ出力があります。コンソールのコマンドからこの出力を取得します。

Number: 9
state: Online
Data:             W1F-9YN
Device: 41
Number: 10
state: Online
Inquiry Data:             W1-9YN                   
Device: 41
Number: 11
state: Online
Inquiry Data:             W1-9YN                   
Device: N/A
Number: 42
state: Online
Data:      WD-W WDZ-04J                

     しかし、今は表形式で出力するように変更したいと考えています。以下のように

Device   number  state    data
41        10     online   WY1-996
42        12     offline  WY2-996
.          .       .        .
.          .       .        .
.          .       .        .

以下のコードを試してみましたが、正しい形式で配置することができず、すべてのデータが 1 つの列に表示されることがあります。誰でも私を助けることができますか?

open WDLIST, "Command";

while (<WDLIST>) {

    if (m/Device\s*:\s*(\d+)/) {

        $enDevice = $1;
        print "$enDevice";
    }

    if (m/Number\s*:\s*(\d+)/) {

        $umber = $1;
        print "$Number";
        chomp;
    }

    if (m/state\s*:\s*(w+)/) {

        $State = $1;
        print"$State";
    }

    if (m/Data\s*:\s*(w+)(d+)(\-)(\s)/) {

        $Data = $1;
        print"$Data";
    }
}

ありがとう!

4

1 に答える 1

1

printf を使用して、出力をフォーマットできます。最も簡単な解決策は、すべての print ステートメントを次のように置き換えることです。

printf "%-10s", $variable;

これにより、変数が 10 文字幅の列に左詰めで出力されます。さらに、データの各ブロックの先頭または末尾に改行を出力する必要があります。

より完全な解決策として、行のハッシュですべてのデータを収集し、データ ブロックの終わりを検出するたびに出力します。

printf "%-10s %-10s %-10s %-10s\n", $info{device}, $info{number}, $info{state}, $info{data};

(または、あまり冗長でないコードにはハッシュ スライスを使用します)

Device各フィールドが新しいデバイスの開始を表すという仮定に基づいています。コードを次のように変更します。

open WDLIST, "Command";

my %device;

printf "%-10s %-10s %-10s %-10s\n", qw(Device number state data);
while (<WDLIST>) {
    if (m/Device\s*:\s*(\d+)/) {

        # Print previous device, if any.
        printf "%-10s %-10s %-10s %-10s\n", @data{ qw(id number state data) }
            if exists $device{id};

        # Reset the current device and set the id
        %device = ( id => $1 );
    }

    if (m/Number\s*:\s*(\d+)/) {
        $device{number} = $1;
    }

    if (m/state\s*:\s*(w+)/) {
        $device{state} = $1;
    }

    if (m/Data\s*:\s*(w+d+-\d+)/) {
        $device{data} = $1;
    }
}
# Print the last device (if any)
printf "%-10s %-10s %-10s %-10s\n", @data{ qw(id number state data) }
    if exists $device{id};

(データの最後の正規表現が実際にどうあるべきか少しわかりfieldません。あなたの例は一貫していません。少なくとも、入力例と出力例のデータフィールド間の関係を説明する必要があります)

于 2012-09-26T19:11:49.810 に答える