Perl 无法截断字符串

Perl Unable to truncate string

我正在尝试从命令 "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(" 和直接 ")" 之间的字符串。请协助。

split 不会满足您的需求。我只会使用正则表达式来匹配您需要的子字符串

所以从这个开始改变循环

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

至此

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

我认为正则表达式方法比此处的 split() 更好,但您可以使用 split() 通过拆分括号并获取返回列表中的第二项。

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

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

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

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

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


在这里,dspmq STDOUT 使用管道 | 送入 perl 代码的 STDIN,它有这些标志:
-e 告诉 Perl 解释器查找内联代码而不是在单独的脚本文件中。
-n 将输入逐行提供给内联代码(这样您就不需要将输出存储在数组中 - 这对大输出很重要,而不是您的情况)。
-l 在将输入记录分隔符(*NIX 上的换行符)提供给代码之前去除它,并在 print 期间自动附加它。

print ... for ... m{... (...) ...} 代码打印括号中捕获的每个模式。
捕获的模式是 [^)]*,这是字符 class 中列出的 (^) 的最大字符数(0 个或更多),也就是说,不是右括号。
[(] ... [)] 是转义为字符 classes 的文字括号,以提高可读性。我更喜欢这样逃避:\( ... \).
QMNAME 用于明确程序员的意图:您希望 QMNAME 后面的字符串在括号中。与使用字段索引(例如 1)相比,我更喜欢它,它可以保护您在使用不同选项、不同系统等时使用的命令输出不会出现微小变化。
最后,m{...}x 中的 x 正则表达式修饰符可以忽略注释和空格,并且是可读性的首选。

相关:
Cutting the output of a dspmq command

可以使用以下代码实现所需的输出

use strict;
use warnings;

use feature 'say';

map{ say  if /QMNAME\((.+?)\)/ } <DATA>;


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

输出

AAA
BBB

和一根衬垫(未测试 - 我在 Windows 电脑上)

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