Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Аналог php'ных stristr и strtr


Автор: psylostlife 30.5.2010, 15:05
Здравствуйте. Только пересел на линух и начал разбираться в перле.

У меня имеется такая конструкция в пхп скрипте:

Код

$size = sizeof( $mats ) - 1;
for($b = 0; $b <= $size; $b++)

{

     if( stristr ( strtr ( $ts, $iscl ), $mats[$b] ) )

     {
         # Действие вывода
         Break;
     }
}


где:
$mats - массив, содержащий подстроки
$ts - строка, в которой ищется вхождение этих подстрок
$iscl - массив исключений вида "подстрока" - "<исключение>" (просто перед поиском сначала вырежем все исключения, на которые может срабатывать)
Ну и последний stristr ищет циклично вхождение. Находит - выводит на экран(или в файл, это не важно), останавливает цикл и идёт следующий виток общего цикла(тут его не привел, написал сам, там считывание из файла построчно).

Помогите пожалуйста, как это можно переписать на перле? Копался в гугле, искал аналоги, но не вышло :(

Автор: arto 30.5.2010, 17:56
что такое "исключение"?

Автор: psylostlife 31.5.2010, 08:25
Это список подстрок, заменяемых на текст "<исключение>" - для того, чтобы исключить срабатывание на определенные слова. Поиск идет по частям слов.

За примером далеко ходить не надо.

Должно, например, срабатывать на тр*х - поэтому перед поиском заменяем слова застрахуй(точнее даже застрах - предугадать -уй, -овать, -овал и прочее).

Автор: sir_nuf_nuf 31.5.2010, 11:26
Код

sub check_mat {
  my $ts = 'застрах*й свой х*й';
  my @iscl = ('застрах');
  my @mats = ('x*й', 'п*д*р*с');
  foreach (@iscl) {
    $ts =~ s/$_/<исключение>/gi;
  }
  foreach (@mats) {
    if ($ts =~ s/$_/) {
      return 1;
    }
  }
  return 0;
}

Это дословный перевод вашего алгоритма.

Но перлист бы написал нечто другое

Автор: arto 31.5.2010, 13:54
антимат? ну-ну.

foreach my $i (@iskl) { $ts =~ s#$i->[0]#$i->[1]#g }
foreach my $m (@mats) { $ts =~ m#$m# && print $&; }

подойдет?

пс. можно где увидеть результат, проверить?

Автор: ming 1.6.2010, 20:35
поиск подстроки в строке - http://perldoc.perl.org/functions/index.html
поиск подстроки в строке без учёта регистра - комбинация index и http://perldoc.perl.org/functions/lc.html


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)