Perl无法截断字符串

问题描述 投票:1回答:4

我正在尝试从命令“ dspmq”的输出中提取AAA和BBB。$ dspmq

QMNAME(AAA)                                           STATUS(Running)
QMNAME(BBB)                                           STATUS(Running)

但是它不适用于下面的代码。

perl -e 'use Data::Dumper qw(Dumper);my @qmgrlist = `dspmq`;$size = @qmgrlist;foreach my $i (@qmgrlist){my @temp1 = split /QMNAME\(/, $i;print @temp1;}'
AAA)                                           STATUS(Running)

BBB)                                           STATUS(Running)

我可以截断"QMNAME(",但不能截断AAABBB右侧的那些。基本上,我想获取"QMNAME("和立即数")"之间的字符串。请协助。

string perl ibm-mq truncate
4个回答
2
投票

[我认为这里的正则表达式方法比split()好,但是您可以使用split(),方法是分割括号并在返回的列表中取第二个项目。

for (@qmgrlist) {
  say +(split /[()]/)[0];
}

以及有关使用命令行选项运行此代码的简短说明。如果您a)将qspmq的输出通过管道传递到您的代码中,并且b)使用-n一次处理一条记录,则可以使其更简单。

$ perl -nE 'say +(split /[()]/)[1]' `dspmq`

也有-M加载模块(例如-MData::Dumper),但是您似乎不再使用Data :: Dumper。


3
投票

split不会做您需要的事情。我只需要使用一个正则表达式来匹配您需要的子字符串

因此,请从此更改循环

foreach my $i (@qmgrlist)
{
    my @temp1 = split /QMNAME\(/, $i;
    print @temp1;
}

对此

foreach my $i (@qmgrlist)
{
    print "$1\n"
        if /QMNAME\((.+?)\)/;
}

2
投票

尝试使用此perl单行代码:dspmq | perl -lne 'print for m{ QMNAME [(] ( [^)]* ) [)] }x'


[此处,dspmq STDOUT是通过管道|馈入perl代码的STDIN中的,它具有以下标志:-e告诉Perl解释器以内联方式而不是在单独的脚本文件中查找代码。-n逐行将输入馈送到内联代码(这样,您就无需将输出存储在数组中-这对于大型输出很重要,而不是在您的情况下)。-l在将输入记录分隔符(* NIX上的换行符)提供给代码之前将其剥离,并在print期间自动将其追加。

print ... for ... m{... (...) ...}代码打印括号中捕获的每个模式。捕获的模式为[^)]*,它是字符类中列出的最多[^)个字符(0个或更多),即not关闭括号。[(] ... [)]是作为字符类转义的文字括号,以提高可读性。我更喜欢这样逃避:\( ... \)QMNAME用于使程序员的意图更明确:您想要在paren中紧随QMNAME的字符串。与使用字段索引(例如1)相比,我更喜欢这样做,它可以防止在使用不同选项,不同系统等的命令输出中出现细微变化。最后,x中的m{...}x regex修饰符使注释和空格可以忽略,并且对于可读性而言是首选。

相关:

Cutting the output of a dspmq command

0
投票
可以通过以下代码实现所需的输出

use strict; use warnings; use feature 'say'; map{ say $1 if /QMNAME\((.+?)\)/ } <DATA>; __DATA__ QMNAME(AAA) STATUS(Running) QMNAME(BBB) STATUS(Running)

输出

AAA BBB

和一根衬垫(未测试-我在Windows计算机上)

dspmq | perl -lne 'print $1 if m/QMNAME\((.+?)\)/'

© www.soinside.com 2019 - 2024. All rights reserved.