我在 Ubuntu 12.04 机器上从我的 Perl 脚本中的变量中提取某些值时遇到了一些麻烦。
我查看了这个页面:How to extract string following a pattern
这就是我想做的事情。我需要在特定模式之后提取一个字符串值。 这是我到目前为止的代码:
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 还是很陌生(到目前为止只用了大约一个星期)。
最佳答案
首先,您不打印 $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;
}
}
关于regex - 在 Perl 中创建正则表达式以提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12875541/