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