Как я могу удалить определенный символ из строки в Perl? - PullRequest
2 голосов
/ 25 октября 2010

Я пытаюсь удалить определенный символ из строки в Perl:

my $string="MATTHATBAT";
substr($string, 2, 1, ''); 

РЕДАКТИРОВАТЬ: Это работает, извините.Оставьте это здесь, если кому-то нужно знать, как это сделать.

Кроме того, есть ли более эффективный способ сделать это?

Теперь строка должна быть MATHATBAT.

Я что-то пропустил?Я знаю, что могу использовать регулярное выражение s ///, но я перебираю строку, ищу определенный символ (этот символ изменяется), затем удаляю символ (но только этот символ с этим смещением).Так что в конечном итоге я буду удалять второй или третий вхождение символа (т. Е. MATTHABAT, MATTHATBA и даже MATHABAT и т. Д.)

Могу ли я сделать это с помощью поиска и замены?Я использую цикл for для перебора смещений.

Ответы [ 3 ]

2 голосов
/ 25 октября 2010

Вот эталонный тест, сравнивающий регулярное выражение с substr:

#!/usr/bin/perl 
use 5.10.1;
use warnings;
use strict;
use Benchmark qw(:all);

my $count = -3;
my $r = cmpthese($count,
  {
    'substring' => sub {
        my $string = "MATTHATBAT";
        substr($string, 2, 1, ''); 
    },
    'regexp' => sub {
        my $string = "MATTHATBAT";
        $string =~ s/(.{2})./$1/;
    },
  }
);

Результат:

               Rate    regexp substring
regexp     162340/s        --      -93%
substring 2206122/s     1259%        --

Как видите, substr примерно в 13,5 раз быстрее, чем регулярное выражение.

@ Sinan ünür 1259% - в 13,5 раза, а не в 12,5 раза.

1 голос
/ 25 октября 2010

Ваш пример работает. $string будет содержать MATHATBAT, как вы и хотели, проблема в другом, а не в этой части.

0 голосов
/ 25 октября 2010

Вы можете зациклить совпадения reg.exp с помощью // g

из perlrequick :

   $x = "cat dog house"; # 3 words
   while ($x =~ /(\w+)/g) {
       print "Word is $1, ends at position ", pos $x, "\n";
   }

думаю вы можете изменить $ x во время итерации ... или вы можете сохранить pos $ x в массиве и затем удалить потом

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