2016-07-25 4 views
0

habe ich ein Perl-Programm-Code, der eine Beschreibungszeichenfolge aus einer Hash zieht.Prüfen, ob ein String enthält eines der Wörter in einem anderen

Ich habe meine Variable $ui gleich der Variablen $uniqueID, aber was ich will, ist wahr zurück, wenn $uialle Wörter enthält in Variable $unqiueID. Aber =~ funktioniert nicht.

Gibt es eine intelligente Art und Weise, dies zu tun?

sub getDescription { 

    my $uniqueID = shift; 
    my $retval; 
    my $ui; 

    foreach my $key (keys %HASHLIST) { 

     foreach $ui (@{ $HASHLIST{$key}->{uniqueID} }) { 

      if ($ui eq $uniqueID) { 
       $retval = $HASHLIST{$key}->{description}; 
       last; 
      } 
     } 

     last if $retval; 
    } 

    return $retval; 
} 
+1

Code sucht, um mich in Ordnung. Testen Sie Ihren Code durch Ersetzen '$ retval = $ HASHLIST {$ key} -> {description};' 'mit print "$ ui \ t $ uniqueID";' – Arijit

+1

Überprüfen Sie auch Ihre '% HASHLIST' ist ihr oder nicht .because Ihre Code hat nicht '% HASHLIST' und zeigen Sie Ihre' = ~ 'Linie – Arijit

+2

Was meinst du mit„= ~ funktioniert nicht“? Hast du versucht, 'if ($ ui = ~/$ uniqueID /) {...}'? – Mikesname

Antwort

2

Eine einfache Möglichkeit zu testen, ob eine skalare Variable enthält eine andere ist:

if ($ui =~ /$uniqueID/) { 
    ... 
} 

(Und wie @Markus Laire Sie weist auch darauf hin können /\b$uniqueID\b/ verwenden Teilwort-Spiele zu verhindern.)

+0

Das OP möchte testen, ob * "$ ui irgendwelche Wörter in der Variablen $ unqiueID" * enthält. Dies wird testen, ob es die gesamte Zeichenfolge in $ uniqueID enthält. – Borodin

+1

@Borodin Ich dachte, das sei unklar, aber der OP bat mich, dies als Antwort zu posten und ich habe es getan. – Mikesname

+1

Und verwenden Sie '/ \ Q $ uniqueID \ E'/falsch-positive und falsch-negative Ergebnisse zu verhindern, wenn '$ uniqueID' Regex Metazeichen hat. – mob

0

Ihre Ziel ist es nicht klar, aber es klingt wie $uniqueID eine Liste von Wörtern, und Sie wollen, dass der erste Eintrag in %HASHLIST deren uniqueID einem dieser Wörter entspricht

Dies wird das für Sie tun, aber ich muss sagen, dass Ihre Datenstruktur nicht ideal für diese Aufgabe geeignet ist

sub getDescription { 

    my ($uniqueID) = @_; 
    my %wanted = map { $_ => 1 } split ' ', $uniqueID; 

    for my $ui (values %HASHLIST) { 
     my @ids = @{ $item->{uniqueID} }; 
     return $item->{description} if @wanted{@ids}; 
    } 

    return $retval; 
} 
Verwandte Themen