我的perl脚本中的某个变量的输出低于输出 - 输出实际上来自某些可执行文件,我在这种情况下存储在变量$ retval中 - 下面的示例
my $retval=`imp_vol -u 110.5 -s 110.9 -p 0.005 -t 0.041 -c 1`
Black Scholes NVol = 1.19711
Black Scholes NDelta = 0.0494522
Black Scholes NGamma = 0.42176
Black Scholes NTheta = -0.302207
Black Scholes NVega = 0.0207006
Black Scholes Vol = 0.0108141
Black Scholes Delta = 0.049565
Black Scholes Gamma = 0.42329
Black Scholes Theta = -0.302212
Black Scholes Vega = 2.29159
这里imp_vol是我的可执行文件,带有不同的参数......它打印出不同的BLack Scholes值。现在我的目的是获得所有Black Scholes值 - 以下是我目前在perl脚本中使用的内容 -
if($retval=~/\s*Black\s+Scholes\s+Vol\s*\=\s*(.*)/i){
$vol=$1;
}
if($retval=~/\s*Black\s+Scholes\s+Delta\s*\=\s*(.*)/i){
$delta=$1;
}
if($retval=~/\s*Black\s+Scholes\s+Gamma\s*\=\s*(.*)/i){
$gamma=$1;
}
if($retval=~/\s*Black\s+Scholes\s+Theta\s*\=\s*(.*)/i){
$theta=$1;
}
if($retval=~/\s*Black\s+Scholes\s+Vega\s*\=\s*(.*)/i){
$vega=$1;
}
if($retval=~/\s*Black\s+Scholes\s+NVol\s*\=\s*(.*)/i){
$nvol=$1;
}
if($retval=~/\s*Black\s+Scholes\s+NDelta\s*\=\s*(.*)/i){
$ndelta=$1;
}
if($retval=~/\s*Black\s+Scholes\s+NGamma\s*\=\s*(.*)/i){
$ngamma=$1;
}
if($retval=~/\s*Black\s+Scholes\s+NTheta\s*\=\s*(.*)/i){
$ntheta=$1;
}
if($retval=~/\s*Black\s+Scholes\s+NVega\s*\=\s*(.*)/i){
$nvega=$1;
}
任何帮助都会受到鼓掌
答案 0 :(得分:4)
您可以使用哈希值来收集它们:
use strict;
use warnings;
my $retval = <<HERE;
Black Scholes NVol = 1.19711
Black Scholes NDelta = 0.0494522
Black Scholes NGamma = 0.42176
Black Scholes NTheta = -0.302207
Black Scholes NVega = 0.0207006
Black Scholes Vol = 0.0108141
Black Scholes Delta = 0.049565
Black Scholes Gamma = 0.42329
Black Scholes Theta = -0.302212
Black Scholes Vega = 2.29159
HERE
my %h;
while ($retval =~ /Black\s+Scholes\s+(\S*)\s*\=\s*(\S*)/ig) {
$h{lc $1} = $2;
}
for my $k (keys %h) {
print "$k, $h{$k}\n";
}
产地:
ntheta, -0.302207
nvega, 0.0207006
ndelta, 0.0494522
vol, 0.0108141
theta, -0.302212
ngamma, 0.42176
nvol, 1.19711
vega, 2.29159
delta, 0.049565
gamma, 0.42329
答案 1 :(得分:1)
首先,您应该将反引号imp_val ...
返回的文本放入数组而不是标量。这将把它分成几行,使其更容易处理。
然后,您可以使用带有正则表达式的map
将其处理为哈希。看起来像这样。请注意,我仅使用Data::Dump
和dd
来演示生成的哈希结构:您不需要在自己的代码中使用它
use strict;
use warnings;
use Data::Dump;
my @retval = `imp_vol -u 110.5 -s 110.9 -p 0.005 -t 0.041 -c 1`;
my %scholes = map { /(\w+)\s*=\s*(-?[\d.]+)/ } @retval;
dd \%scholes;
输出根据您在问题中显示的数据
{
Delta => 0.049565,
Gamma => 0.42329,
NDelta => 0.0494522,
NGamma => 0.42176,
NTheta => -0.302207,
NVega => 0.0207006,
NVol => 1.19711,
Theta => -0.302212,
Vega => 2.29159,
Vol => 0.0108141,
}
<强>更新强>
从您的其他注释中看起来您希望子例程返回特定的值序列。我建议这段代码最好:
use strict;
use warnings;
use Data::Dump;
sub scholes {
my @retval=`imp_vol -u 110.5 -s 110.9 -p 0.005 -t 0.041 -c 1`;
my %scholes = map { /(\w+)\s*=\s*(-?[\d.]+)/ } @retval;
return @scholes{qw/ Vol Delta Gamma Theta Vega NVol NDelta NGamma NTheta NVega /};
}
dd [ scholes ];
<强>输出强>
[
0.0108141,
0.049565,
0.42329,
-0.302212,
2.29159,
1.19711,
-0.302207,
0.0207006,
0.0494522,
0.42176,
]