1

我是 Perl 的新手。我只想问如何使用正则表达式在搜索列表中排除不必要的浮点数。

我有脚本的这个示例部分:

#!/usr/bin/perl

use strict;
use warnings;

my $teststring = "delay PADI_DEL,del:0.352, 0.352, 0.376, 0.376 PIO PAD PADDI (PADDI:PADDI IOBUF:::IO_TYPE=SUBLVDS,BANK_VCCIO=2.5); pio_INR_drt";

$teststring =~ s/[^\d.\s]//g;
print "$teststring\n";

我期望这样的输出:

0.352 0.352 0.376 0.376

提取是正确的,但是在我寻找的最后一个浮点数之后我得到了不必要的数字。使用我的代码的实际输出是这样的:

0.352 0.352 0.376 0.376      2.5  

我将如何修改我的正则表达式,使其不会检测到“2.5”不必要的浮点数。

谢谢您的帮助。

4

4 回答 4

2
my @nums = $teststring =~ /[\d.]+/g;
pop @nums;
print "@nums\n";
于 2013-01-04T07:40:34.707 回答
0

您可以先删除父母中的东西,(最后是前面的空白):

$teststring =~ s/\([^)]*\)//;
$teststring =~ s/[^\d.\s]//g;
$teststring =~ s/^\s*//;

使用数组存储数字的想法相同:

$teststring =~ s/\([^)]*\).*$//;
my @v = ($teststring =~ /\d+\.\d+/g);
print join (" ", @v), "\n";
于 2013-01-04T07:36:36.547 回答
0

如果您的输入格式是刚性的,可以像这样直接抓取浮点数

#!/usr/bin/perl

use strict;
use warnings;

my $teststring = "delay PADI_DEL,del:0.352, 0.352, 0.376, 0.376 PIO PAD PADDI (PADDI:PADDI IOBUF:::IO_TYPE=SUBLVDS,BANK_VCCIO=3.3); pio_INR_drt";

$teststring =~ s/(0\.\d+).*(0\.\d+).*(0\.\d+).*(0\.\d+)//g;
print "$1 $2 $3 $4\n";

这将搜索 0.XXX 格式的 4 个浮点数。

于 2013-01-04T07:38:25.973 回答
0

如果您的浮点数始终为 5 个字符长(4 个数字和一个点),则此正则表达式可以解决问题:

s/[\d.]{5}//g;
于 2013-01-04T07:39:07.660 回答