2010-10-25 4 views
2

Je suis en train de supprimer un caractère spécifique d'une chaîne en Perl:Comment puis-je supprimer un caractère spécifique d'une chaîne en Perl?

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

EDIT: Cela fonctionne, désolé. Laissant ceci ici au cas où quelqu'un devrait savoir comment faire ceci.

De plus, existe-t-il un moyen plus efficace de le faire?

La chaîne devrait maintenant être MATHATBAT.

Ai-je raté quelque chose? Je sais que je peux utiliser regex s ///, mais je suis itératif à travers la chaîne, en cherchant un certain caractère (ce char change), puis en supprimant le caractère (mais seulement ce caractère à ce décalage). Donc, finalement, je vais supprimer la deuxième ou la troisième occurrence du personnage (MATTHABAT, MATTHATBA et même MATHABAT etc.)

Puis-je faire cela en utilisant la recherche et le remplacement? J'utilise une boucle for pour itérer à travers les offsets.

+0

ça marche pour moi –

+0

Ah, oui, je vois ça fonctionne maintenant dans un nouveau script. Je vais comprendre le problème, mais y a-t-il une meilleure façon de le faire? Cela ne semble pas super efficace de cette façon. – Bharat

+0

Le problème n'est toujours pas clair - ce qui détermine le caractère à supprimer? que c'est un doublon? et voulez-vous supprimer les instances suivantes de ce caractère, mais pas les instances précédant le premier caractère supprimé? – plusplus

Répondre

2

Voici une référence comparaient regexp 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/; 
    }, 
    } 
); 

Résultat:

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

Comme vous pouvez le voir, substr est d'environ 13,5 fois plus vite que regex.

@Sinan Ünür 1259% est 13.5 fois et non 12.5 fois.

+0

C'est révélateur. Je suppose que le fait d'être plus facile à écrire ne le rend pas plus facile à exécuter ou plus vite :) Merci! – Bharat

1

Votre exemple fonctionne. Le $string contiendra MATHATBAT comme vous vouliez avoir, le problème est ailleurs, pas dans cette partie.

+0

Merci, je le vois maintenant. Je vais creuser pour l'erreur :) Y at-il une meilleure façon de le faire, le savez-vous? Merci encore! – Bharat

0

Vous pouvez boucler la reg.exp correspond à // g

de perlrequick:

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

pense vous pouvez modifier $ x .. ou tout itérer vous pouvez stocker pos $ x dans un tableau et puis retirer après

Questions connexes