我确信有更好的方法从字符串中提取行和列
这是$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";
}
20
96
答案 0 :(得分:2)
类似的东西:
// 26.2.7/3 abs(__z): Returns the magnitude of __z.
template<typename _Tp>
inline _Tp
__complex_abs(const complex<_Tp>& __z)
{
_Tp __x = __z.real();
_Tp __y = __z.imag();
const _Tp __s = std::max(abs(__x), abs(__y));
if (__s == _Tp()) // well ...
return __s;
__x /= __s;
__y /= __s;
return __s * sqrt(__x * __x + __y * __y);
}
正则表达式中的my $var = `stty -a`;
if (my ($rows, $cols) = $var =~ /rows\s+(\d+);\s+columns\s+(\d+)/) {
print "$rows\n";
print "$cols\n";
}
表示&#34;前面的一个或多个。&#34;它使正则表达式比试图像+
处理它简单得多。如果你真的想要&#34;前面的两个或三个&#34;你可以写出像\d\d|\d\d\d
这样的表达式。
如果您正在寻找一种更标准的方法来确定当前终端窗口的大小,您可以查看CPAN上的各种\d{2,3}
模块。
答案 1 :(得分:0)
您应该将stty
的输出作为一般字符串处理
这是一个处理您的示例字符串的示例。我使用Data::Dump
来显示根据模式匹配构建的哈希值,并且还显示了您似乎感兴趣的两列 - rows
和columns
< / p>
#! /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