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("
但无法截断 AAA
和 BBB
右侧的那些。基本上我想得到 "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\((.+?)\)/'
我正在尝试从命令 "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("
但无法截断 AAA
和 BBB
右侧的那些。基本上我想得到 "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\((.+?)\)/'