<> =~ 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
。
もう 1 つのエラーは、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";