Вот простой способ отправить пару и получить строку, охватывающую другую, или undef
.
($enclosing) = grep { /$s2/ && /$s1/ } ($s1, $s2);
Вот способ, чтобы получить строки заказаны как ($inside, $enclosing)
или получить пустой список
@sorted = sort { "$b$a" =~ /^$b.*$b/ <=> "$a$b" =~ /^$a.*$a/ }
grep { $s1 =~ /$s2/ || $s2 =~ /$s1/ } ($s1, $s2);
Этой первые отфильтровывают случае не состязаний по двухстороннему регулярному выражению, проходя через пустой список.
В обоих случаях равные слова никоим образом не обозначаются как таковые, и я не вижу, как они могут быть.
Однако они содержат друг друга и, вероятно, могут быть обработаны таким же образом.
Единственное решение в этом ответе, которое поставляет это @mask
ниже, устанавливается в (1,1)
в этом случае.
Весь код здесь пробегает use warnings
, который для краткости опущен.
Первоначально. Возвращает копию слова, которое находится внутри другого или undef
.
($in) = map { /^($s1).*$s1|(^$s2).*$s2/ ? $1 // $2 :() } ("$s1$s2", "$s2$s1");
Комментарии пояснили, что возвращение кода, который может содержать строку, внутри которой может быть другой, может оказаться полезным.
($sc) = map { /^($s1).*$s1|(^$s2).*$s2/ ? ($1 && 1) || ($2 && 2) :() }
("$s1$s2", "$s2$s1");
$sc
является 1
, когда $s1
содержится в $s2
или 2
, когда $s2
находится в $s1
или undef
иным образом.
В зависимости от того, как это предназначается, чтобы быть использованы, происхождение выше, может быть полезным
@mask = map { /^($s1.*$s1)|(^$s2.*$s2)/ ? 1 : 0 } ("$s1$s2", "$s2$s1");
@mask
имеет (bool, bool)
для того, слова ($s1, $s2)
находятся внутри другой.
Это: (1,1)
(равно), или (1,0)
или (0,1)
(для $s1
или $s2
внутри другого) или (0,0)
(отдельной).
Как насчет проверки длины обеих строк перед 'index()'? –
Что делать, если длина такая же? скажем, A = «abcd» B = «bcef», тогда я не смогу решить, какой из них следует передать подстрокой. –
Что вы подразумеваете под «лучшей техникой»? В одной строке одно утверждение, наиболее эффективное, самое элегантное ...? – zdim