2016-04-28 16 views
-1

同じ文字が文字列内に置かれている限り、文字の並び順が同じであると見なすコードを作成したいと思います。たとえば、誰かが文字列値 "svk"または "kvs"を入力すると、$ a = "ksv"と仮定して、これらの文字列が$ aと等しいコードを記述したいとします。ここに例があります。perl内の文字列の文字順

@ans=("ksv", "kvs", "svk", "vsk",......); 

if (@input[1] ~~ @ans) { 
      return 'EXACT_ANS'; 
} 

@ input [1]はユーザーが文字列を入力するものです。最初は、配列の要素のいずれかが@input [1]と一致した場合、正しい答えとして返すように、配列のさまざまな種類をすべて配列としてリストしました(例のように)。しかし、長めの長さのストリングがあれば、これはかなり長時間の面倒な作業です。これについて私に助言を与えてください。あなたはあなたがnormalize_stringはすべて同等の入力に同じ文字列を返す、と等価ではない入力の異なる文字列を返すサブあるフォーム

if (normalize_string($input) eq normalize_string('ksv')) { 
    ... 
} 

の何かをしたい

+0

2つの文字列の長さが等しくなければなりませんか?言い換えれば、 'svksvk'も一致する必要がありますか? – ThisSuitIsBlackNot

+0

Perlが警告するので、 '@input [1]'は '$ input [1]'を書く標準的ではありません。 – ikegami

+0

まず、スマートマッチを使用しないでください。 '$ input [1] ~~ @ ans'は実験的な機能であり、後のバージョンの言語から変更または削除することができます。最良の選択肢は 'List :: Util :: first'です – Borodin

答えて

0

を^^ありがとうございます。


normalize_stringの正確な定義は、同等とみなされる内容によって異なります。

あなたが重複した文字を無視したい場合は

abbcabcに同等である):

sub normalize_string { 
    my %h; 
    ++$h{$_} for split //, $_[0]; 
    return join '', sort keys %h; 
} 

各文字のインスタンスの数が適切である場合(abbcabcに同等ではありません):

sub normalize_string { 
    return join '', sort split //, $_[0]; 
} 

もちろん、パラメータが定数の場合、正規化されたフォームをインライン化できます。