<> =~ m/([\+-][0-9]*)x|([\+-][0-9]*)y/;
print "$1, $2";
各种输入的输出是:
3x+1y ----->, +1
10x-2y -----> , -2
-5x+2y -----> -5,
-10x+5y -----> -10,
它基本上是随机的,有时会打印出 x 的系数,有时会打印出 y。出了什么问题?
你的模式有一个交替:/(...)x|(...)y/
. 因此,您的模式匹配类似-2x
或的内容+5y
。
另一个错误是您需要 x 坐标上的符号(+ 或 -)。你可能想要一个像这样的正则表达式:
/^\s* ([+-]?[0-9]+)x ([+-][0-9]+)y \s*$/x
use strict;
use warnings;
my ($x, $y);
($x, $y) = <> =~ m/([+-]?[0-9]+(?=[xy]))/g; #assuming x is always the first term
print "$x, $y\n";
对于更复杂的表达式,您也可以使用它。
use strict;
use warnings;
my (%number); #use a hash to store coeficcient and variables
my $expression = <>;
while ($expression =~ m/([+-]?[0-9]+)([a-z]+)/ig){
$number{ $2 } += $1;
}
for my $variable (sort keys %number){
print "$variable has coeficcient $number{ $variable }\n";