2016-03-05 94 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

不是一個深思熟慮的答案。將重新考慮這個問題。

相關問題