2011-01-16 17 views
1

Quelle string:

  1. Mandarin Chinesisch (1,1 Milliarden)
  2. Hindi/Urdu (350 Millionen)
  3. Spanisch (330 Mio.)
  4. Englisch (300 Mio.)
  5. Arabisch (200 Millionen)

Versuchen, nur den Sprachnamen zu extrahieren.

Ich habe diesen Code zur Zeit, die

if($line =~ m!\s(.*)\(!) 
    { 
     print $1 . "\n" ; 
    } 

funktioniert, aber ich versuche die quotemeta Funktion zu verwenden, um es zu tun, was ich kann nicht zu tun in der Lage sein scheint.

my $regex = quotemeta("\s(.*)\("); 
#Also tried as i suspect the \s is my problem. 
    my $regex = quotemeta("\\s(.*)\("); 


    if($line =~ m/$regex/) 
    { 
     print $1 . "\n" ; 
    } 

Wird jeder Stil gegenüber dem anderen bevorzugt?

+1

Was ist die Frage? – tchrist

+0

Ich bin neu in Perl und Regex, lass mich meine Frage bearbeiten – freshWoWer

Antwort

6

Ich verstehe nicht, was Sie versuchen zu verwenden quotemeta für.

Wenn Sie tatsächliche Regex-Sprache haben, dann Sie nicht möchten, um es zu zitieren.

my $regex = qr/\s(.*)\(/; 
if ($line =~ /$regex/) ... 

Wenn Sie es zitieren wollen (Sie wollen \s(..*)\( die Zeichenfolge genau übereinstimmen), brauchen Sie nicht quotemeta explizit, aber das ist effektiv, was Sie jetzt tun.

my $str = '\s(.*)\('; 
if ($line =~ /\Q$str\E/) ... 
+0

Danke, ich habe mich geirrt, ich brauche die quotemeta Funktion, um mir zu helfen, Sonderzeichen für Regex zu entkommen, in Perl zu arbeiten, weil es sonst mit den Klammern in meiner Regex, qr verwirrt // funktionierte für mich dank – freshWoWer

2

Ich stimme mit @ephemient überein, dass quotemeta hier nicht benötigt wird.

Ich würde verwenden, um die /x Modifikator die regexp besser lesbar zu machen:

if($line =~ m/ \s (.*) \(/x) 

und nehmen es Schritt weiter

if($line =~ m/ 
    \s  # space 
    (.*) # capture anything 
    \(  # up to and not including a (
    /x) 

Eine Verfeinerung. Momentan erfassen Sie den Raum nach English. Ich möchte hinzufügen,

if($line =~ m/ 
    \s  # space 
    (.*) # capture anythin 
    \s+ # up to and not including space 
    \(  # a (
    /x) 

Schließlich - und sehen, was Ihr Programm tut, wenn Sie geben ihm

1. English (GB) (300 million) 
2. Arabic (200 million (2005 value)) 

Ein Werk, das andere tut. Es könnte sein, warum verstehen!

+0

Das ist "Schrägstrich x", nicht "Backslash x". – tchrist

+0

Entschuldigung. Korrigiert jetzt – justintime

+0

ist es die gierige vs nicht-gierige Sachen :) ändern (. *) Zu (. *?), Vielen Dank für Ihre Hilfe! – freshWoWer