2

Ubuntu 12.04 ボックスで Perl スクリプトの変数から特定の値を取得するのに少し問題があります。

このページに目を通しました:パターンに従って文字列を抽出する方法

そして、これは私がやりたいことの一種です。特定のパターンの後に文字列値を抽出する必要があります。これまでのコードは次のとおりです。

foreach $HDD (@sds)
{
    $hdStat = `hdparm -i $HDD | grep -Po 'Model=\K.*?(?=,)'`;
    $sdModel{$HDD} = $hdStat;
    $hdStat = `hdparm -i $HDD | grep -Po 'SerialNo=\K.*?(?=")'`;
    $sdSerial{$HDD} = $hdStat;
}
foreach $HDD (keys %sdModel)
{
    print $sdModel{$HDD};
}
foreach $HDD (keys, %sdSerial)
{
    print $sdSerial{$HDD};
}

Model 文字列は正常に返されますが、SerialNo 文字列は返されません。コードは grep である必要はありません。上記のリンクからコードを変更しました。そして、私が正規表現でどれほどひどいかを見て、おそらくここで基本的な何かが欠けています。

ところで、このコードの目的は、/dev フォルダーを調べてディスク ドライブを見つけることです。見つかった場合は、配列に設定し、上記のスクリプトでモデル番号とシリアル番号を取得します。また、私がやっていることのより良い方法を誰かが見つけたら、私は提案を歓迎します。私はまだ Perl に非常に慣れていません (これまでに約 1 週間しか使用していません)。

4

2 に答える 2

1

まず、$sdSerial を印刷しません。

第二に、いくつかの外部呼び出しを節約し、正規表現を次のように単純化できます。

foreach my $HDD (@sds) {
    my @hdparm = `hdparm -i $HDD`;
    foreach my $ln (@hdparm) {
        if (my($model, $serial) = ($ln =~ m/Model=(.+?),.+?,\s*SerialNo=(.+)/)) {
            $sdModel{$HDD} = $model;
            $sdSerial{$HDD} = $serial;
        }
    }
}

上記は次のように簡略化できます。

foreach my $HDD (@sds) {
    my $hdparm = `hdparm -i $HDD`;
    if (my($model, $serial) = ($hdparm =~ m/Model=(.+?),.+?,\s*SerialNo=(.+)/)) {
        $sdModel{$HDD} = $model;
        $sdSerial{$HDD} = $serial;
    }
}
于 2012-10-13T18:33:15.980 に答える
0

シリアル番号を抽出するには、次の正規表現を試してください。

$hdStat = `hdparm -i $HDD | grep -Po 'SerialNo=\K.*?'`;
于 2012-10-13T18:29:08.690 に答える