[英]equivalent of shell script's grep command in perl
我在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”,因為我必須再次在某個函數中傳遞該變量。
任何幫助將不勝感激。
perl中實際上有一個grep
函數。 它將表達式或塊作為第一個參數,將字符串列表作為第二個參數。 所以你可以這樣做:
my @list = grep(/abcd/, (<>));
在您的特定情況下,您可以使用塊表單來提取價格,如下所示:
imp_vol | perl -e 'print grep { s/\s+Black Scholes Vol = ([-+]?[0-9]*\.?[0-9]+)/$1/ } (<>)'
如果你想要像你的grep
那樣的所有“Black Scholes”都匹配
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+)?)/;'
要執行該命令,可以使用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;
括號創建一個捕獲組 ,將值提取到特殊的$1
變量中。
如果您能夠管道輸入而不必在Perl中執行命令,則以下單行程就足夠了:
imp_vol ... | perl -ne 'print $1 if /Black Scholes Vol = (.*)/'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.