2010-08-01 4 views
2

EDIT: tr /// ne supporte pas l'interpolation de variables, alors je suis allé avec s/\Q$_\E//g; à la placede la tr Perl /// ne fait pas ce que je veux

Ou, plus probablement, je ne fais quelque chose de bien .. .

Je le code suivant:

#!/usr/bin/perl 

use strict; 
use warnings; 
use utf8; 

sub strip_invalid { 
    my ($str, @chars) = @_; 

    map { $str =~ tr/$_//; } @chars; 

    return $str; 
} 

my @invalid = qw(a e i o u); 

print strip_invalid("This is the super sample with vowels.\n", @invalid); 

Je voudrais simplement passer une chaîne à strip_invalid() et ont tr/// enlever les personnages @invalid par un map ... Où est-ce que je me trompe? (en passant, en utilisant des expressions régulières cela fonctionne).

Répondre

7

Perl tr fonctionnalité doesn't support variables.

Notez que parce que la table de traduction est construite au moment de la compilation, ni la LISTE DE RECHERCHE ni la LISTE DE REMPLACEMENT ne sont soumises à une interpolation de guillemets doubles. Cela signifie que si vous voulez utiliser des variables, vous devez utiliser un eval():

eval "tr/$oldlist/$newlist/"; 

(Source)

4

Depuis tr/// ne permet pas l'utilisation de variables, je suggère quelque chose le long de ces lignes (plutôt que d'utiliser eval, ce qui soulève d'autres préoccupations):

sub strip_invalid { 
    my $str = shift; 
    my $chars = quotemeta(join '', @_); 
    $str =~ s/[$chars]//g; 
    return $str; 
} 

Notez également que tr/// a une option de suppression, il est donc pas nécessaire de itérer sur tous les caractères que vous voulez supprimer. Par exemple:

$str =~ tr/aeiou//d; # Delete all vowels from $str 
2

Pour supprimer avec tr, vous devez spécifier l'indicateur/d. Sinon, il utilise par défaut la liste de remplacement basée sur la liste de recherche (il suffit donc de compter ou de comprimer).

Et tr ne supporte pas l'interpolation de variables.

Pour utiliser tr, vous aurez besoin de faire quelque chose comme ceci:

sub strip_invalid { 
    my ($str, @chars) = @_; 

    my $strip = quotemeta join '', @chars; 
    eval "\$str =~ tr/$strip//d"; 

    return $str; 
} 
Questions connexes