2016-03-05 96 views
-1

我有一个数组包含@arr = { "a=b", "a>b", "a<b", "a!=b", "a-b" }。与任何运营商之间取得a和b的最佳方式是什么?我可以如何提取字符串之间的任何运算符?

for($i=0; $i<=$#arr; $i++){ 
    $str = $arr[$i]; 
    if($str =~ m/^(.*?)(\s*=\s*)(.*)(;)/g){ 
     my $d = $1; 
     my $e = $3; 
    } 

遵循所有如果与可能的操作语句像"!=", "<"等提取但是,这将让我的代码显得凌乱。任何更好的解决方案?

+0

我可以知道谁投了这个问题和原因吗?谢谢 – tim

回答

0

一个非常简单的正则表达式可能是

/^(\w+)\s*(\W+)\s*(\w+)$/ 

或者你列举可能的运营商

/^(\w+)\s*(=|!=|<|>|<=|>=|\+|-|\*|\/|==)\s*(\w+)$/ 

这取决于输入是否可以信任与否。如果没有,你可能必须更加细致。标识符也一样。这是一个更简单的循环,不需要使用m // g(lobal)。不确定分号 - 省略它。

my @arr = ("a=b", "a>b", "a<b", "a!=b", "a-b"); 
for my $str (@arr){ 
    if($str =~ /^(\w+)\s*(=|!=|<|>|<=|>=|\+|-|\*|\/|==)\s*(\w+)$/){ 
     my $d = $1; 
     my $e = $3; 
     print "d=$d e=$e\n"; 
    } 
} 

后来如果你列举的经营者,也可以加字符号:

if($str =~ /^(\w+)\s*(=|!=|<|>|<=|>=|\+|-|\*|\/|==|x?or|and)\s*(\w+)$/){ 
    ... 
+0

感谢它的工作!如果我的'@arr =(“a和b”,“a或b”,“a和b”),还有一个问题。我可以通过使用一个评论吗? – tim

0

你可以尝试这样的事情一个衬垫

perl -e '@a = ("a=b","a>b","a<b","a!=b","a-b"); for $l (@a) { $l =~ s/(.).*(.)/$1/; print "$1$2\n"};' 

事情的关键是贪婪匹配即两个单个字符匹配(即“(。)”)之间的“(。*)”。要真正确保你开始在开始和字符串的结束时,你可以用它演示了整个事情这

perl -e '@a = ("a=b","a>b","a<b","a!=b","a-b"); for $l (@a) { $l =~ s/^(.).*(.)$/$1/; print "$1$2\n"};' 

一个完整的工作的例子是

#!/usr/bin/perl 
use strict; 
use warnings; 
my @expressions = ("a=b","a>b","a<b","a!=b","a-b"); 
for my $exp (@expressions) { 
    $exp =~ s/^(.).*(.)$/$1$2/; 
    print "$1$2 is the same as $exp\n"; 
}; 
0

如果总是“一”和'b'在开始和结束你可以尝试:

my $str = 'a<b'; 
my($op) = $str =~ /^a(.*)b$/; 
0

不是一个深思熟虑的答案。将重新考虑这个问题。

相关问题