Size: a a a

2020 January 15

AP

Anton Petrusevich in Modern::Perl
Andrey Konovalov
Тем, что в Perl из этого будет собран полноценный хеш, а в Ruby символы в конечном итоге на этапе компиляции конвертятся в целые числа.
Не будет
источник

AK

Andrey Konovalov in Modern::Perl
my ($class, %opts) = @_

%opts - какой-то особенный?
источник

AP

Anton Petrusevich in Modern::Perl
Это ты его собрал. Можно и не собирать
источник

AK

Andrey Konovalov in Modern::Perl
Типа самому проходить по списку?
Ну тогда это будут постоянные сравнения строк
источник

AP

Anton Petrusevich in Modern::Perl
Хеш вообще всегда про сравнение строк. Но можно и без, хотя извратно
источник

AK

Andrey Konovalov in Modern::Perl
Anton Petrusevich
Хеш вообще всегда про сравнение строк. Но можно и без, хотя извратно
Хеш - скорее всё-таки про функцию хеширования и только в случае наличия коллизий в самом примитивном варианте - про прямое сравнение строк
источник

AK

Andrey Konovalov in Modern::Perl
Народ, а какой самый быстрый способ определить общий префикс 2-х строк? Я думал, это вообще просто, есть XS-как, но  пока не нахожу.
источник

AK

Andrey Konovalov in Modern::Perl
Нашёл самый короткий конечно в кодгольфе, но мне не нужен короткий, нужен максимально быстрый
источник

В

Вертолетчик in Modern::Perl
Andrey Konovalov
Народ, а какой самый быстрый способ определить общий префикс 2-х строк? Я думал, это вообще просто, есть XS-как, но  пока не нахожу.
Длина префикса известна?
источник

AK

Andrey Konovalov in Modern::Perl
Мне её нужно найти
Что-то вроде fire/fuel - один символ
Я так понимаю, что ничего быстрее посимвольного сравнения слева направо не может быть, разве что сравнивать не по 1 байту, например, а по 4. И явно такую логику можно сделать очень быстрой на Си, но не на perl
источник

AK

Andrey Konovalov in Modern::Perl
Если сравнивать по 4 байта - делать xor и смотреть, где первый установленный в 1 бит, для чего в обычном Intel Asm'е есть инструкции прямо.
источник

AK

Andrey Konovalov in Modern::Perl
Тут ещё определённый косяк в том, что сравнивать нужно строго ASCII, не UTF (но XS-ка это небось итак бы учла и заюзала бы разные алгоритмы для строк, где только ASCII и остальных).
источник

AK

Andrey Konovalov in Modern::Perl
источник

AK

Andrey Konovalov in Modern::Perl
Нет, не нашёль: оно ищет какие-то крутые штуки типа просто общих подстрок, где бы они ни были
источник

AP

Anton Petrusevich in Modern::Perl
Andrey Konovalov
Народ, а какой самый быстрый способ определить общий префикс 2-х строк? Я думал, это вообще просто, есть XS-как, но  пока не нахожу.
на счёт быстрого не обещаю, бенчмаркать надо:
$ perl -E '$a="abcdefghijkl"; $b="abcdef01234"; $c = $a ^ $b; say $-[0] if $c =~ m{([^\0])};'
6
источник

AK

Andrey Konovalov in Modern::Perl
Anton Petrusevich
на счёт быстрого не обещаю, бенчмаркать надо:
$ perl -E '$a="abcdefghijkl"; $b="abcdef01234"; $c = $a ^ $b; say $-[0] if $c =~ m{([^\0])};'
6
sub __lcp {
   return undef unless @_;
   my $i = 0;
   use bytes;
   my ($L, $R) = ( length($_[0]), length($_[1]) );
   my $max_l = $L > $R ? $R : $L;
   for (; $i < $max_l; $i++) {
       ord(substr $_[0], $i, 1) == ord(substr $_[1], $i, 1) or last
   }
   no bytes;
   $i
}
источник

AK

Andrey Konovalov in Modern::Perl
Цикл конечно жесть, если так на мильон символов - всё время потратим тупо на интерпретацию "байт-кода" perl
источник

SZ

Sergey Zhmylove in Modern::Perl
Andrey Konovalov
sub __lcp {
   return undef unless @_;
   my $i = 0;
   use bytes;
   my ($L, $R) = ( length($_[0]), length($_[1]) );
   my $max_l = $L > $R ? $R : $L;
   for (; $i < $max_l; $i++) {
       ord(substr $_[0], $i, 1) == ord(substr $_[1], $i, 1) or last
   }
   no bytes;
   $i
}
Щьо за трэш? И это производительный код?? Ффууу
источник

AP

Anton Petrusevich in Modern::Perl
Andrey Konovalov
Цикл конечно жесть, если так на мильон символов - всё время потратим тупо на интерпретацию "байт-кода" perl
забенчмаркай
источник

AP

Anton Petrusevich in Modern::Perl
а то так можно и сплитом строки на массивы разбить...
источник