Frage Häufige Probleme für Perl? [geschlossen]


Die Frage nach Versteckte Funktionen von Perl ergab zumindest Eine Antwort das könnte entweder als ein Merkmal oder ein Fehlmerkmal betrachtet werden. Es erschien logisch, dieser Frage nachzugehen: Was sind die üblichen nicht offensichtlichen Fehler in Perl? Dinge, die scheinbar funktionieren sollten, aber nicht.

Ich werde keine Richtlinien geben, wie man Antworten strukturiert, oder was "zu einfach" ist, um als eine Frage zu gelten, denn das ist es, wofür man wählen muss.

Tabelle der Antworten

Syntax

Semantik / Sprachfunktionen

Debuggen

Best Practices

Meta-Antworten

Siehe auch: ASP.NET - Häufige Probleme


74
2017-10-03 12:51


Ursprung


Antworten:


Die Tatsache, dass einfache Anführungszeichen verwendet werden können, um :: in Bezeichnern zu ersetzen.

Erwägen:

use strict;
print "$foo";        #-- Won't compile under use strict
print "$foo's fun!"; #-- Compiles just fine, refers to $foo::s

Führt zu folgendem Problem:

use strict;
my $name = "John";
print "$name's name is '$name'";
# prints:
#  name is 'John'

Um dies zu vermeiden, sollten Sie Klammern um Ihren Variablennamen verwenden:

print "${name}'s name is '$name'";
# John's name is 'John'

Und auch zu use warnings, da es dir über die Verwendung der undefinierten Variable erzählen wird $name::s


37
2017-10-03 14:25



Sie können auf ein lexikalisches Dateihandle drucken: gut.

print $out "hello, world\n";

Sie erkennen dann, dass es nett sein könnte, einen Hash von Dateihandles zu haben:

my %out;
open $out{ok},   '>', 'ok.txt' or die "Could not open ok.txt for output: $!";
open $out{fail}, '>', 'fail.txt' or die "Could not open fail.txt for output: $!";

So weit, ist es gut. Versuchen Sie nun, sie zu verwenden und nach einer Bedingung zu dem einen oder dem anderen zu drucken:

my $where = (frobnitz() == 10) ? 'ok' : 'fail';

print $out{$where} "it worked!\n"; # it didn't: compile time error

Sie müssen die Hash-Dereferenz in ein Paar Curlies einpacken:

print {$out{$where}} "it worked!\n"; # now it did

Dies ist völlig nicht intuitives Verhalten. Wenn Sie nichts davon gehört haben oder es in der Dokumentation gelesen haben, bezweifle ich, dass Sie es selbst herausfinden könnten.


28
2017-10-04 00:45



Dies ist eine Meta-Antwort. Viele böse gotchas sind gefangen Perl :: Kritiker, die Sie installieren und über die Befehlszeile mit dem ausführen können perlcritic Befehl oder (wenn Sie Ihren Code über das Internet senden möchten und Ihre Optionen nicht anpassen können) Perl :: Critic Website.

Perl::Critic verweist auch auf Damian Conways Perl Best Practices Buch, einschließlich Seitenzahlen. Wenn du also zu faul bist, das ganze Buch zu lesen, Perl::Critic kann dir immer noch die Bits erzählen sollte lese.


26
2017-10-03 15:11



Perls DWIMmer kämpft mit << (hier-Dokument) Notation bei der Verwendung print mit lexikalischen Dateihandles:

# here-doc
print $fh <<EOT;
foo
EOT

# here-doc, no interpolation
print $fh <<'EOT';
foo
EOT

# bitshift, syntax error
# Bareword "EOT" not allowed while "strict subs" in use
print $fh<<EOT;
foo
EOT

# bitshift, fatal error
# Argument "EOT" isn't numeric...
# Can't locate object method "foo" via package "EOT"...
print $fh<<'EOT';
foo
EOT

Die Lösung besteht darin, entweder Leerzeichen zwischen dem Dateihandle und dem << oder um das Dateihandle zu disambiguieren, indem es eingepackt wird {} Hosenträger:

print {$fh}<<EOT;
foo
EOT

18
2017-10-03 21:06



Das Perltrap Die Manpage listet viele Fallen für die Unachtsamen nach Typ geordnet auf.


17
2017-10-03 12:59



Das Zuweisen von Arrays zu Skalaren macht für mich keinen Sinn. Beispielsweise:

$foo = ( 'a', 'b', 'c' );

Weist 'c' zu $ ​​foo zu und wirft den Rest des Arrays weg. Dieser ist seltsamer:

@foo = ( 'a', 'b', 'c' );
$foo = @foo;

Dies sieht so aus, als ob es das gleiche wie das erste Beispiel tun sollte, aber stattdessen setzt es $foo zum Länge von @foo, damit $foo == 3.


15
2017-10-03 12:55



Der häufigste Fehler ist, dass Sie Ihre Dateien mit etwas anderem starten

use strict;
use diagnostics;

pjf fügt hinzu: Bitte seien Sie gewarnt, dass die Diagnose eine hat von Bedeutung Auswirkung auf die Leistung. Es verlangsamt den Programmstart, da es perldiag.pod laden muss, und bis bladperl wie vor ein paar Wochen, verlangsamt es auch und bläht Regexps auf, weil es $ & verwendet. Warnungen verwenden und ausführen splain auf die Ergebnisse wird empfohlen.


15
2017-10-03 12:58



Verwirrende Referenzen und tatsächliche Objekte:

$a = [1,2,3,4];
print $a[0];

(Es sollte einer von sein $a->[0] (Beste), $$a[0], @{$a}[0] oder @$a[0])


15
2017-10-06 17:07