0

%% の真ん中にある which と $$ で始まる単語を grep しなければならない変数があります。私は分割を使用しました...しかし、いくつかのシナリオでのみ機能します。

例:

#!/usr/bin/perl
my $lastline ="%Filters_LN_RESS_DIR%\ARC\Options\Pega\CHF_Vega\$$(1212_GV_DATE_LDN)";
my @lastline_temp = split(/%/,$lastline);
print @lastline_temp;
my @var=split("\\$\\$",$lastline_temp[2]);
print @var;

期待どおりにo/pを取得します。しかし、Grep コマンドを使用して同じものを取得できますか。array[2]つまり、 orを使いたくないということですarray[1]。値を簡単に置き換えることができるように。

4

2 に答える 2

1

まず、 quotesの使用には細心の注意を払ってください。 which'%Filters_LN_RESS_DIR%\ARC\Options\Pega\CHF_Vega\$$(1212_GV_DATE_LDN)' の代わりに "%Filters_LN_RESS_DIR%\ARC\Options\Pega\CHF_Vega\$$(1212_GV_DATE_LDN)" 別の文字列である可能性があることを意味していないかどうかはわかりません 。たとえば、評価された場合、"$$"は変数を意味します$PROCESS_ID

なぞなぞを解こうとして(それについてはわかりません)、文字列を引用した後

my $lastline = 
          '%Filters_LN_RESS_DIR%\ARC\Options\Pega\CHF_Vega\$$(1212_GV_DATE_LDN)'

別の方法として、次を使用します。

my ($w1, $w2) = $lastline =~ m{ %        # the % char at the start
                               ([^%]+)   # CAPTURE everything until next %
                                [^(]+    # scan to the first brace
                                \(       # hit the brace
                               ([^)]+)   # CAPTURE everything up to closing brace
                              }x;
print "$w1\n$w2";

あなたの言葉を抽出します。結果:

Filters_LN_RESS_DIR
1212_GV_DATE_LDN

しかし、値を簡単に置き換えるとはどういう意味ですか。どの値?

補遺

で区切られた「単語」を抽出しましょう'\'。単純な分割を使用する:

my @words = split /\\/,  # use substr to start split after the first '\\'
                  substr $lastline, index($lastline,'\\'); 

$$(..)最後のエントリ (文字列)を削除すると、バックスラッシュの間に単語が表示されます。

pop @words;                # remove the last element '$$(..)'
print join "\n", @words;   # print the other elements

結果:

ARC
Options
Pega
CHF_Vega

これは grep でうまく機能しますか? と思われる:

 my @words = grep /^[^\$%]+$/, split /\\/, $lastline;

 print join "\n", @words;

また、次のようになります。

 ARC
 Options
 Pega
 CHF_Vega

多分それはあなたが求めているものですか?これらをどうしたいですか?

よろしく

rbo

于 2012-07-11T13:19:00.807 に答える
1

期待する出力を得る方法がよくわかりません。データを「ビジー」引用符 (補間、二重など) に入れるため、次のように保存されます。

'%Filters_LN_RESS_DIR%ARCOptionsPegaCHF_Vega$01212_GV_DATE_LDN)'
  • Quote および Quote-like Operatorsを参照し、Perl での Interpolation をお読みください。
  • バックスラッシュがなくなっていることに注意してください。引用符を補間するバックスラッシュは、単に「次の文字をリテラルとして扱う」ことを意味するため、リテラル'A'、リテラル'O'、リテラル'P'、...を取得します。
  • それ'0'は、無意識のうちに補間を求めた$((aka $REAL_GROUP_ID)の値です。したがって、分割するシーケンスはありません'$$'

grepコマンドを使用して同じものを取得できますか?「同じ」とは何かによります。結果をarraysに保存します。目的はgrep、配列からものを除外することです。自明ではない grep: を使用すると、配列も配列の出力もありませんgrep {; 1 } @data

実際には、この正規表現を使用してまったく同じ結果を得ることができます。単一の文字列@varsが「結果」であると仮定します。

m/%([^%]*)$/

もちろん、これに過ぎない

substr( $lastline, rindex( $lastline, '%' ) + 1 );

8 ~ 10 倍速く実行できます。

于 2012-07-11T14:23:05.087 に答える