Was enthält eine Variable wirklich?

Inhalt:

Du willst eine Regex auf eine Variable anwenden oder sie mit einem anderen String vergleichen, aber es passt einfach nicht. Warum?

Debugging

Die erste schnelle Abhilfe ist, einfach ein Statement einzubauen, das die Variable ausgibt, bei CGI-Programmen vorzugsweise ins erorlog:

my $var = "ups, text mit leerzeichen am ende ";
warn "\$var: '$var'";

# ausgabe:
# $var: 'ups, text mit leerzeichen am ende ' at mainskript.pl line 4.

Beachte die Anführungszeichen um $var. Damit erkennst du leicht, ob vielleicht am Ende noch ein vergessenes Leerzeichen oder ein Zeilenumbruch steckt.

Noch schöner und eindeutiger ist eine Ausgabe mit dem Standardmodul Data::Dumper:

use Data::Dumper;

my $var = "ups, text mit zeilenumbruch am ende\n";
warn Dumper $var;
#ausgabe:
# $VAR1 = 'ups, text mit zeilenumbruch am ende
# ';
# hash
warn Dumper \%hash;

# array
warn Dumper \@array;

Dieser Code gibt dir (fast) jede Datenstruktur in beliebiger Tiefe aus. So entgeht dir nichts.

Mitunter kommt es aber vor, dass man auch nicht-druckbare Zeichen hat, die dann in der Dumper-Ausgabe verschwinden oder sie sogar unlesbar machen, z.b. Backspaces. Aber auch dafür gibt es eine Lösung:

use Data::Dumper;
local $Data::Dumper::Useqq = 1;

my $var = "text mit carriage return\r und null\0bytes";
warn Dumper $var;
# ausgabe:
# $VAR1 = "text mit carriage return\r und null\0bytes";

# ausgabe ohne Useqq wäre:
#  und nullbytes';t carriage return

Indem man Useqq auf 1 setzt, sagt man, dass die Ausgabe alle nicht-druckbaren zeichen lesbar ausgibt, also ein Newline wird dann tatsächlich als \n ausgegeben, und andere Sonderzeichen mit ihrem Hexcode. Das schöne ist, die Ausgabe ist komplett gültiger Perlcode. Damit entgeht dir nun wirklich gar nichts mehr.

Naja, bis auf eine Ausnahme. Falls du zum Beispiel mit utf-8 hantierst, kann es nützlich sein, zu wissen, ob ein String das UTF8-Flag enthält.

use Devel::Peek; # standard seit perl 5.6
Dump $string;

Dieser Code gibt dir die interne Repräsentation des Strings auf STDERR aus.

Ergänzungen, Kommentare

Kommentare werden am besten in folgender Form vorgenommen, damit sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne das <verbatim>):
---+++ Main.??? - 14 Jul 2003 - Betreff

UtilFaqSubForm edit

Titel Was enthält eine Variable wirklich?
Autor TinaMueller
Bereich FaqAllgemeines
Tags Debugging, Data::Dumper
Topic revision: r2 - 2009-09-27 - 14:34:18 - TinaMueller
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.