2015-02-12 97 views
1
$s1 = 'c1 n1 n2 c = 44.3 + (w - 2) * (l - 0.5) * 0.836 
$s2 = 'c1 n1 n2 c = 41.8 + (w - 2) * (l - 0.5) * 0.744 

輸出需要爲($ s1爲基準,因此,$ S2給這裏的輸出)比較兩個字符串和參數化它們perl的

c1 n1 n2 c = param1 + (w - 2) * (l - 0.5) * param2 
.param1 41.8 
.param2 0.744 

因此,基本的想法是,數字,琴絃之間的變化應該被參數..

----------任何想法將是巨大的--------

我預期的解決方案,現在(在尋找更多的東西優雅/更好):

完全參數多在開始 - 那就是,使字符串看起來像

c1 n1 n2 c= param0 + (w - param1) * (l - param2) * param3 

然後恢復不改變號碼,然後重新數量PARAMS

$count = 0 
@params =(); 
while($s2 =~ s/(?<!\w)((?:[0-9.]{2,}|[0-9]+)(?:e[+-]?\d+)?)/param$count/){ 
    push(@params, $1); 
    $count++; 
} 

然後你對$ s1做同樣的事,創建另一個數組(例如@ref_params)。 然後一個for循環來比較和恢復不變的數字。

回答

0

這將工作假設您的字符串是空格分隔的,但您也可以調整拆分以適用於操作員和分組。

這個問題其實很簡單:同時遍歷兩個字符串,當遇到差異時將其轉換爲參數並記下s2的值。

sub parameterize { 
    my @s1 = split /\s+/, shift; 
    my @s2 = split /\s+/, shift; 

    die "strings have different lengths" unless $#s1 == $#s2; 

    my @out; 
    my @params; 
    for (my $i=0; $i <= $#s1; $i++) { 
     if ($s1[$i] eq $s2[$i]) { 
      $out[$i] = $s1[$i]; 
     } else { 
      push @params, $s2[$i]; 
      $out[$i] = 'param' . ($#params + 1); 
     } 
    } 

    return join(' ', @out), map("[email protected]{[ $_+1 ]} $params[$_]", 0..$#params); 
} 

my $s1 = 'c1 n1 n2 c = 44.3 + (w - 2) * (l - 0.5) * 0.836'; 
my $s2 = 'c1 n1 n2 c = 41.8 + (w - 2) * (l - 0.5) * 0.744'; 
print join("\n", parameterize($s1, $s2)),"\n"; 

c1 n1 n2 c = param1 + (w - 2) * (l - 0.5) * param2 
.param1 41.8 
.param2 0.744