2016-04-28 2 views
-1

Я хочу написать код, который касается строк с символами в другом порядке, равными тем же самым тем же символам, что и в строках. Например, предположим, что $ a = "ksv", когда кто-то вводит строковое значение "svk" или "kvs", я хочу написать код, который эти строки эквивалентны $ a. Вот пример:порядок символов строки в perl

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

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

@input [1] - это то, что пользователь поставит строку. Сначала я перечислил все различные типы порядка в виде массива (как и в примере), так что, если один из элементов массива совпадает с @input [1], я верну его в качестве правильного ответа. Тем не менее, это довольно длинная и утомительная работа, если у меня есть строка с гораздо большей длиной. Пожалуйста, дайте мне совет по этому поводу. Спасибо ^^

+0

Должны ли длины двух строк быть равными? Другими словами, должен ли 'svksvk' также соответствовать? – ThisSuitIsBlackNot

+0

Как Perl предупредит вас, '@input [1]' является нестандартным способом записи '$ input [1]'. – ikegami

+0

Прежде всего, не используйте смарт-матч. '$ input [1] ~~ @ ans' - экспериментальная функция, которая может быть изменена или удалена из более поздних версий языка. Лучшей альтернативой является «List :: Util :: first» – Borodin

ответ

0

Вы хотите что-то в виде

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

где normalize_string является подгруппой, которая возвращает ту же строку для всех эквивалентных входов и возвращает различные строки для входов, которые не являются эквивалентными.


Точное определение normalize_string будет варьироваться в зависимости от того, что вы считаете эквивалент.

Если вы хотите игнорировать повторяющиеся символы (abbc эквивалентен abc):

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

Если количество экземпляров каждого символа уместно (abbc не эквивалентен abc):

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

Конечно, вы можете включить нормализованную форму, когда параметр является константой.

Смежные вопросы