Thread HTML::Parser und substr() (46 answers)
Opened by GwenDragon at 2023-05-09 13:09

haj
 2023-05-11 15:12
#194848 #194848
User since
2015-01-07
531 Artikel
BenutzerIn

user image
2023-05-11T07:15:03 rosti
Aber vielleicht kannst Du ja mal erklären warum man Pragma bytes nur für Debugging verwenden soll und ansonsten nicht.

Ich kann's zumindest versuchen.

Ein ä kann in Perl auf diversen Wegen entstehen. Das kann aus einer Datei kommen, aus dem Internet, oder vom Aufrufer an ein Unterprogramm übergeben werden. Hier mal ein paar Beispiele für einfache Zuweisungen:
  • Code (perl): (dl )
    my $ae_1 = chr 0xe4;

  • Code (perl): (dl )
    my $ae_2 = "\N{U+e4}";

  • Code (perl): (dl )
    my $ae_3 = "\N{LATIN SMALL LETTER A WITH DIAERESIS}";

Wenn man die untereinander mit eq vergleicht, dann sind sie gleich. Alle haben eine Länge von 1 und werden mit m/\w/ als "Wort"-Zeichen identifiziert. Außer use bytes und anderen Debugging-Tools (z.B. Perldoc:Devel::Peek) gibt es keine Möglichkeit, sie voneinander zu unterscheiden.
Unter use bytes gibt aber keine Möglichkeit, die Variablen $ae_1, $ae_2 und $ae_3 korrekt auszugeben.
Es braucht nicht unbedingt zwei verschiedene ä-Variablen, um den Effekt zu demonstrieren. Sowas wie das unten folgende Euro-Beispiel habe ich mehrmals reparieren müssen und immer war das Wehklagen "Ohne Encode geht's nicht und mit Encode geht's auch nicht!"
Das Code-Beispiel ist für eine UTF-8-Konsole gedacht, unter Windows (cmd.exe) geht's also mit chcp 65001:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use 5.020;
use Encode;
my $ae_1 = chr 0xe4;
my $ae_2 = "\N{U+e4}";
my $ae_3 = "\N{LATIN SMALL LETTER A WITH DIAERESIS}";
my $euro = "\N{EURO SIGN}";

{
    say "Ohne 'use bytes', mit Encode";
    say "1 = 2"  if $ae_1 eq $ae_2;
    say "2 = 3"  if $ae_2 eq $ae_3;
    say encode 'UTF-8',
        " mit encode: ae_1 = $ae_1, ae_2 = $ae_2, ae_3 = $ae_3";
    say encode 'UTF-8',
        " mit encode: Ein '$ae_1' kostet 1$euro";
    say "-" x 50;
}
{
    use bytes;

    say "Mit 'use bytes'";
    say "1 = 2"  if $ae_1 eq $ae_2;
    say "2 = 3"  if $ae_2 eq $ae_3;
    say "ohne encode: ae_1 = $ae_1, ae_2 = $ae_2, ae_3 = $ae_3";
    say encode 'UTF-8',
        " mit encode: ae_1 = $ae_1, ae_2 = $ae_2, ae_3 = $ae_3";
    say "ohne encode: Ein '$ae_1' kostet 1$euro";
    say encode 'UTF-8',
        " mit encode: Ein '$ae_1' kostet 1$euro";
}

View full thread HTML::Parser und substr()