Perl 无法截断字符串



我正在尝试从命令"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()更好,但是您可以通过拆分括号并获取返回列表中的第二项来使用split()

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

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

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

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

split

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

所以从这里改变循环

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

对此

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

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


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

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

相关:
剪切 dspmq 命令的输出

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

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 /QMNAME((.+?))/'

相关内容

  • 没有找到相关文章

最新更新