Regex 从stty-a输出中提取成对值的正则表达式

Regex 从stty-a输出中提取成对值的正则表达式,regex,perl,Regex,Perl,我确信有更好的方法从字符串中提取行和列 这是$var可以设置的示例 my $var = "speed 38400 baud; rows 20; columns 96; line = 0;" 下面的程序可以运行,但我正在寻找一个更好的正则表达式 #! /usr/bin/perl #use strict; #use warnings; my $var = `stty -a`; if ( $var =~ /speed\s+38400\s+baud\;\s+rows\s+(\d\d)\;\s+c

我确信有更好的方法从字符串中提取行和列

这是
$var
可以设置的示例

my $var = "speed 38400 baud; rows 20; columns 96; line = 0;"
下面的程序可以运行,但我正在寻找一个更好的正则表达式

#! /usr/bin/perl

#use strict;
#use warnings;

my $var = `stty -a`;

if ( $var =~ /speed\s+38400\s+baud\;\s+rows\s+(\d\d)\;\s+columns\s+(\d\d\d|\d\d)/ ) {
    printf $1;
    printf "\n";
    print "$2\n";
}
输出: 比如:

my $var = `stty -a`;
if (my ($rows, $cols) = $var =~ /rows\s+(\d+);\s+columns\s+(\d+)/) {
  print "$rows\n";
  print "$cols\n";
}
正则表达式中的
+
表示“前面的一个或多个”。它使正则表达式比像
\d\d |\d\d
那样处理要简单得多。如果您确实想要“前面的两个或三个”,您可以编写类似于
\d{2,3}
的表达式


如果您正在寻找一种更标准的方法来确定当前终端窗口的大小,您可以查看CPAN上的各种
Term::size
模块

您应该将
stty
的输出作为常规字符串进行处理

下面是一个处理示例字符串的示例。我使用了
Data::Dump
来显示从模式匹配中构建的哈希,并且还显示了您似乎感兴趣的两列--

#! /usr/bin/perl

use strict;
use warnings;

use feature 'say';

use Data::Dump;

#my $var = `stty -a`;
my $var = 'speed 38400 baud; rows 20; columns 96; line = 0;';

my %comms = do {
    my @comms = grep $_, split /\s*;\s*/, $var;
    map /(\S*) [\s=]* (.*) /x, @comms;
};

dd \%comms;

say $comms{rows};
say $comms{columns};
输出
一定要考虑使用<代码>条款::大小<代码>。这是一个更好的方式来询问终端有多大。
#! /usr/bin/perl

use strict;
use warnings;

use feature 'say';

use Data::Dump;

#my $var = `stty -a`;
my $var = 'speed 38400 baud; rows 20; columns 96; line = 0;';

my %comms = do {
    my @comms = grep $_, split /\s*;\s*/, $var;
    map /(\S*) [\s=]* (.*) /x, @comms;
};

dd \%comms;

say $comms{rows};
say $comms{columns};
{ columns => 96, line => 0, rows => 20, speed => "38400 baud" }
20
96