簡體   English   中英

相當於perl中的shell腳本的grep命令

[英]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/, (<>));

另見: grep - perldoc.perl.org

在您的特定情況下,您可以使用塊表單來提取價格,如下所示:

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+)?)/;'

使用正則表達式

while (<>) {
    next if !/abcd/;
    # ...
}

另外,要替換cut,請使用捕獲組 ,但我無法提供更多代碼,因為我不知道您的數據格式。

要執行該命令,可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM