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

时间:2015-10-19 19:40:26

标签: 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+columns\s+(\d\d\d|\d\d)/ ) {
    printf $1;
    printf "\n";
    print "$2\n";
}

输出:

20

96

2 个答案:

答案 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来显示根据模式匹配构建的哈希值,并且还显示了您似乎感兴趣的两列 - rowscolumns < / 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