该命令的输出为ent3
,并且我希望从该输出中将3
存储在变量中
sub {
if ( $exit == 1 )
{
$cmdStr = "lsdev | grep en | grep VLAN | awk '{ print \$1 }'\r";
$result =_run_cmd($cmdStr);
my @PdAt_val = split("\r?\n", $result);
my $num = $result =~ /([0-9]+)/;
print "The char is $num\n";
$exit = 0;
exp_continue;
sub {
if ( $exit == 1 ) {
$cmdStr = "lsdev | grep en | grep VLAN | awk '{ print \$1 }'\r";
$result = _run_cmd($cmdStr);
my @PdAt_val = split("\r?\n", $result);
my $num = $result =~ /([0-9]+)/;
print "The char is $num\n";
$exit = 0;
exp_continue;
答案 0 :(得分:0)
使用正则表达式,类似这样的方法应该起作用:
if($result =~ /([0-9]+)/) {
$num = $1;
}
print $num;
答案 1 :(得分:0)
您在此处执行工作的代码是:
my $num = $result =~ /([0-9]+)/;
让我们将其放入一个简单的程序中,以便我们可以看到发生了什么事。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my $result = 'ext3';
my $num = $result =~ /([0-9]+)/;
say $num;
然后打印1
。这不是我们想要的。发生了什么事?
好吧,如果您阅读了match运算符的文档(在“ perlop”中的Regexp Quote-Like Operators部分中),您将看到该运算符在不同情况下返回的内容。它说:
在字符串中搜索模式匹配,如果成功,则在标量上下文中返回true,如果失败,则返回false。
因此可以解释我们所看到的行为。 “ 1”只是表示匹配成功的真实值。但是我们如何获得括号中所捕获的价值。有两种方法。首先,将其写入$1
变量中。
my $num;
if ($result =~ /([0-9]+)/) {
$num = $1;
}
say $num;
但是我认为另一种方法是您想要的。如果继续阅读,您将看到操作符在列表上下文中返回的内容:
列表上下文中的
m//
返回一个列表,该列表由与模式中的括号匹配的子表达式组成,即($1
,$2
,$3
... )
因此,如果将match运算符放在列表上下文中,那么我们将获得返回的$1
的内容。我们如何将匹配项放入列表上下文?通过使表达式成为列表分配-我们可以通过在分配的左侧加上括号来实现。
my ($num) = $result =~ /([0-9]+)/;
say $num;