Perl 将相似的词变大

Perl 将相似的词变大,perl,Perl,下面是perl脚本中某个变量的输出,输出实际上来自某个可执行文件,在本例中,我将其存储在变量$retval中-下面的示例 my $retval=`imp_vol -u 110.5 -s 110.9 -p 0.005 -t 0.041 -c 1` Black Scholes N

下面是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;
    }

任何帮助都会受到欢迎

您可以将其收集到散列中:

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";
}

首先,您应该将backticks
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,
]

返回($vol、$delta、$gamma、$theta、$vega、$nvol、$ndelta、$ngamma、$ntheta、$nvega、$error);是的,我想将单个值传递给某个函数-而是执行
return($h{vol},$h{delta},…)
尝试使用时,它应该打印出它不工作的loks(我的%h);而($retval=~/Black\s+Scholes\s+(\s*)\s*\=\s*(\s*)/ig){$h{lc$1}=$2;}打印“waheguru$h{'Vol'}$h{'Delta'}”;注意
$h{lc$1}=$2
中的
lc
,因此您应该使用小写:
打印“waheguru$h{'vol'}$h{'delta'}”
@perareal这真的很有帮助,但也有可能我的应用程序/可执行文件无法计算NVGA或nvol等。因此,在这种情况下,我需要将对应于该值的NULL值传递给函数中的值
[
  0.0108141,
  0.049565,
  0.42329,
  -0.302212,
  2.29159,
  1.19711,
  -0.302207,
  0.0207006,
  0.0494522,
  0.42176,
]