2017-09-24 1 views
3

Ich stieß auf ein Perl-Programm, das die Anzahl der Vokale in einer Zeichenfolge zählt. Aber ich kann nicht auf eine einzelne Zeile schließen, wie es funktioniert. Wer kann dieses Programm Zeile für Zeile entschlüsseln?

$\=$/;map{ 
    $_=<>;print 0+s/[aeiou]//gi 
}1..<> 
+0

Das ist ein Mißbrauch von 'map' und sollte mit einer gewöhnlichen' for' Schleife gemacht werden: 'print <> = ~ tr/aeiouAEIOU //," \ n "für 1 .. <>'. Ich weiß nicht, ob das leichter zu verstehen ist. – Borodin

Antwort

9

Was in Perl bedeutet $\=$/;?

Sets $\ auf den Wert von $/.

$/ definiert die Endung der Leitung für readline (<>). Der Standardwert ist ein Zeilenvorschub (U + 000A).

$\ ist an den Ausgang von jedem print angehängt. Der Standardwert ist die leere Zeichenfolge.

Also, vorausgesetzt $/ hatte sich nicht verändert worden ist, setzt es $\-Feed-Linie, die print wirken wie say macht.

Wer kann dieses Programm Zeile für Zeile dekodieren?

  1. Weltweit machen print wirken wie say.
  2. Lesen Sie eine Zeile von ARGV.
  3. Für eine Anzahl von Malen gleich der Anzahl Lese,
    1. eine Linie von ARGV lesen.
    2. Verwenden Sie s/[aeiou]//gi, um die Anzahl der Vokale zu zählen.
    3. Drucken Sie das Ergebnis.

Im skalaren Kontext s///g gibt die Anzahl der Spiele/Ersatz. 0+ zwingt skalaren Kontext.


By the way, tr/aeiouAEIOU// wäre schneller als 0+s/[aeiou]//gi, und nicht mehr. Es ist auch zerstörungsfrei.

+1

Vielen Dank, mein Herr. Eine weitere Sache, was bedeutet "1 .. <>" am Ende der Karte? –

+1

Lesen Sie eine Zeile von ARGV. Erstellen Sie eine Liste mit Zahlen von 1 bis zur gelesenen Nummer. – ikegami