Perl, как сделать выравнивание строк в Perl - PullRequest
0 голосов
/ 18 ноября 2011

если у меня есть две разные строки, такие как:

my $a = "garfieldaagt";
my $b = "field";

и мне нужно выровнять их как

garfieldaagt
   field

, чтобы сравнить их, как я могу это сделать?

Есть идеи?Спасибо

Ответы [ 5 ]

6 голосов
/ 18 ноября 2011

Вы можете использовать функцию index для поиска строки внутри строки, а затем использовать оператор x повторения , чтобы выровнять вашу подстроку в положение, в котором она была найдена вдлинная строка.

$a = "garfield";
$b = "field";
print $a,"\n";
print " " x index($a,$b) ,$b,"\n";
2 голосов
/ 18 ноября 2011

Если вы хотите сравнить визуально, см. Другой ответ. Если вы хотите сравнить программно, возможны несколько вариантов.

  1. Вы можете использовать отрицательные индексы в строках и сравнивать символьно.
  2. Вы можете использовать substr и сравнивать меньшую строку с подстрокой большего
  3. Вы можете использовать положительные индексы, но добавить разницу в длине к index в большей строке

Наконец, если вы хотите добавить строки одинаковой длины с пробелами, вы можете использовать sprintf таким же образом, как printf.

Второй вариант - это то, что программист может написать в рабочем коде:

my $x = "foobar";
my $y = "bar";

if ($y eq substr $x, -length($y))
{
    print "$y is a suffix of $x\n";
}

Регулярное выражение или поиск по всей подстроке - это перебор.

0 голосов
/ 20 сентября 2013

Динамическое программирование - это способ сделать это, вы получите:

Garfield

Garied

до

1009 * Garfield *

Гар-т-д

Это выравнивание. Любая другая вещь может быть поиск префикса, поиск подстрок или что у вас есть.

Это делается путем сравнения Garfield x Garied в форме матрицы и нахождения самого длинного и дешевого пути от первой буквы, соответствующей последней, штрафуя пробелы.

Если у вас меньше обычных букв с более высокой оценкой, выравнивание может быть лучше. Но не обязательно в случае естественных языков (английский, испанский).

Привет

0 голосов
/ 18 ноября 2011

Это похоже на проблему XY.Я думаю, что этот вопрос больше касается определения того, содержится ли строка B внутри строки A.

В то время как комбинация substr / index заманчиво использовать,регулярные выражения лучше подходят для этого требования:

my $stringA = 'garfieldaagt';
my $stringB = 'field';

print "'$stringB' contained in '$stringA'\n" if $stringA =~ /$stringB/;
# 'field' contained in 'garfieldaagt'

Использование регулярных выражений также поможет решить более сложные задачи, такие как сопоставление без учета регистра.

См. perldoc perlrequick длякраткое введение.

0 голосов
/ 18 ноября 2011

Вы можете использовать printf для печати этих строк с выравниванием:

printf "%8s\n%8s", $a, $b;

Число 8 здесь указывает, сколько символов используется для печати строк, включая пробелы, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...