我在shell脚本中使用了以下语法 -
imp_vol -u $undr_price -s $str_price -p $price -t $mat -c $iscall | grep "Black Scholes " | cut-d"=" -f2
其中imp_vol
是可执行文件,可以打印某些内容。在Perl脚本中它的等价物是什么?例如:
imp_vol -u 110.5 -s 110.9 -p 0.005 -t 0.041 -c 1
Underlying Price = 110.5
Strike Price = 110.9
Price = 0.005
Time = 0.041
IsCall = 1
Black Scholes Vol = 0.0108141
所以我的目的是在这种情况下将Black Scholes Vol
的值设置为某个变量中的`.0108141,因为我必须再次在某个函数中传递该变量。
任何帮助将不胜感激。
答案 0 :(得分:2)
perl中实际上有一个grep
函数。它将表达式或块作为第一个参数,将字符串列表作为第二个参数。所以你可以这样做:
my @list = grep(/abcd/, (<>));
在您的具体情况下,您可以使用块表单来提取价格:
imp_vol | perl -e 'print grep { s/\s+Black Scholes Vol = ([-+]?[0-9]*\.?[0-9]+)/$1/ } (<>)'
答案 1 :(得分:1)
如果您希望所有“Black Scholes”与您的grep
匹配
imp_vol -u $undr_price -s $str_price -p $price -t $mat -c $iscall | perl -ne 'print $1 if $_ =~ /Black Scholes .* = (\d+(?:\.\d+)?)/;'
“Black Scholes Vol”正好
| perl -ne 'print $1 if $_ =~ /Black Scholes Vol = (\d+(?:\.\d+)?)/;'
答案 2 :(得分:0)
答案 3 :(得分:0)
要执行该命令,您可以使用open
获取一个文件句柄,您可以从中读取其输出。然后,您可以使用单个正则表达式匹配该行并提取该值。例如:
my $cmd = "imp_vol -u $undr_price -s $str_price -p $price -t $mat -c $iscall";
open (my $imp, '-|', $cmd) or die "Couldn't execute command: $!";
my $extracted;
while (<$imp>) {
if (/Black Scholes Vol = (.*)/) {
$extracted = $1;
}
}
close $imp;
括号创建capture group,将值提取到特殊$1
变量中。
如果你能够管道输入而不必在Perl中执行命令,那么下面的单行就足够了:
imp_vol ... | perl -ne 'print $1 if /Black Scholes Vol = (.*)/'