0

我有一个变量,我必须从中 grep %% 中间的 which 和以 $$ 开头的单词。我使用 split 它可以工作...但仅适用于某些情况。

例子:

#!/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

首先,在使用引号时要非常小心,我不确定您是否不是指 '%Filters_LN_RESS_DIR%\ARC\Options\Pega\CHF_Vega\$$(1212_GV_DATE_LDN)' which "%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 中的插值
  • 请注意,反斜杠消失了。插入引号中的反斜杠仅表示“将下一个字符视为文字”,因此您会得到 literal 'A', literal 'O', literal 'P', ....
  • '0'就是$((aka $REAL_GROUP_ID) 的值,您无意中要求它进行插值。所以没有'$$'拆分的顺序。

你能用grep命令得到同样的结果吗?这取决于“相同”是什么。您将结果保存在数组中,目的grep是从数组中排除事物。如果您使用非平凡的 grep: ,您将既没有数组,也没有数组的输出grep {; 1 } @data

@vars实际上,假设其中的单个字符串是“结果” ,您可以使用此正则表达式获得完全相同的结果。

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

当然,也不过如此

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

它可以运行速度快 8-10 倍。

于 2012-07-11T14:23:05.087 回答