2010-11-19 10 views
0

Warum das nicht funktioniert?Perl anonyme Liste Frage

my $str = 'we,you,them,us'; 

print $(split($str,','))[0]; 

Ich weiß, was ich tun kann:

my @str = split... 

aber ich erinnere mich es eine Möglichkeit, das überspringen ist.

Danke,

+0

Heck, ich kann nicht einmal es kompilieren. Wenn '$ (...)' für etwas funktionieren könnte, könnten Sie etwas anderes als das bekommen, was Sie erwarten. Aber das ist ein Fall, in dem die Sprache einfach nicht so funktioniert. Möglicherweise haben Sie etwas aus den * skalaren Dereferenzierungsklammern * '$ {...}' erhalten. Außerdem sucht es in "$ _" nach "wir, du, sie, uns" und findet es nicht. Die Sache, die Sie teilen möchten, ist das Argument * second *, das Trennzeichen ist das erste. – Axeman

Antwort

8

Sie haben die Reihenfolge der Argumente für Split umgekehrt. Es sollte kein Dollarzeichen vor den Parens geben. Die folgenden Werke (die Pluszeichen Kräfte perl die folgenden als Ausdruck auszuwerten):

use strict; 
use warnings; 

my $str = 'we,you,them,us'; 

print +(split(',',$str))[0]; 
+3

Sie haben dort vier Zeichen hintereinander, XYXY, wobei das erste Y etwas völlig anderes tut als das zweite Y, aber das gleiche Aussehen hat. Das ist verwirrend. Deshalb wechseln die Leute in diesem Szenario zu einem dicken Komma. Darüber hinaus spart Ihnen das führende Plus-zu-Niederlage-Argument nur ein Zeichen auf Kosten einer weiteren möglichen Quelle von Verwirrung oder Fehlern. Ich empfehle daher, die letzte Zeile als 'print ((split)," => $ str) [0]); " Ist das nicht viel lesbarer? *** Ich denke natürlich, aber Ihre 1 km Lauf kann variieren. – tchrist

+0

Danke! und wo kann ich über diese Dinge lesen? Ich habe in perltoc-Subman-Seiten gesucht, aber konnte keine verwandten Sachen finden. – snoofkin

+0

@ soulSurfer2010: Lesen Sie was? Das beste, was zu tun ist, ist Chdir zum Pod-Verzeichnis und Grep großzügig. – tchrist

-1

[split $str, ',']->[0]; Verwendung wäre in Ordnung.

+0

keine Notwendigkeit, ein anonymes Array zu erstellen – Arkadiy

5

Jedes Mal, wenn Sie nur auf einen kleinen Teil des Rückgabewerts einer Funktion zugreifen müssen, sollten Sie überprüfen, ob es eine kleinere Bereichsfunktion gibt, die Sie verwenden können. In diesem Fall könnte ich einen regulären Ausdruck verwenden:

print $str =~ /^([^,]*)/;