I try to follow what LanX does with the REPL. I'm confused right now.
$ perl -de1
Loading DB routines from perl5db.pl version 1.53
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(-e:1): 1
DB<1> $str = '\\x{A3f4}'
+
DB<2> p $str
+
\x{A3f4}
Ok, so we begin the game with a string that has 2 backslashes before an x and then curly braces containing a value. We ask the debugger to print the value, and the output differs from the original string by having one fewer backslash.
Q1) What makes you think this is a left-curly brace? I don't doubt you; I just can't get there:
DB<2> print $str
+
\x{A3f4}
DB<3> print "$str"
+
\x{A3f4}
Q2) What is \x{value} called? I'm going up a wall trying to disambiguate it. I think it's completely-different from my \x experience with it in a regex: perlre#/x-and-/xx. Continuing:
DB<3> if ( $str =~ /(\\x{[A-F\d]+})/i ) { print $1 }
+
Unescaped left brace in regex is deprecated here (and will be fatal in
+ Perl 5.30), passed through in regex; marked by <-- HERE in m/(\\x{ <
+-- HERE [A-F\d]+})/ at (eval 13)[/usr/share/perl/5.28/perl5db.pl:738]
+ line 2.
Ok, let's stop here. When I'm debugging my stuff, I typically think that the first error message is the one I need to attend to. What follows was the stack of things that bombed out because of the first error. This is as clear as an error message is, except that I'm not quite sure where it stops and the next one begins. Let's take a look at the rest of the message:
at (eval 13)[/usr/share/perl/5.28/perl5db.pl:738] line 2.
eval 'no strict; ($@, $!, $^E, $,, $/, $\\, $^W) = @DB::saved;pack
+age main; $^D = $^D | $DB::db_stop;
if ( $str =~ /(\\\\x{[A-F\\d]+})/i ) { print $1 };
' called at /usr/share/perl/5.28/perl5db.pl line 738
DB::eval called at /usr/share/perl/5.28/perl5db.pl line 3138
DB::DB called at -e line 1
Unescaped left brace in regex is deprecated here (and will be fatal in
+ Perl 5.30), passed through in regex; marked by <-- HERE in m/(\\x{ <
+-- HERE [A-F\d]+})/ at (eval 13)[/usr/share/perl/5.28/perl5db.pl:738]
+ line 2.
at (eval 13)[/usr/share/perl/5.28/perl5db.pl:738] line 2.
eval 'no strict; ($@, $!, $^E, $,, $/, $\\, $^W) = @DB::saved;pack
+age main; $^D = $^D | $DB::db_stop;
if ( $str =~ /(\\\\x{[A-F\\d]+})/i ) { print $1 };
' called at /usr/share/perl/5.28/perl5db.pl line 738
DB::eval called at /usr/share/perl/5.28/perl5db.pl line 3138
DB::DB called at -e line 1
Unescaped left brace in regex is deprecated here (and will be fatal in
+ Perl 5.30), passed through in regex; marked by <-- HERE in m/(\\x{ <
+-- HERE [A-F\d]+})/ at (eval 13)[/usr/share/perl/5.28/perl5db.pl:738]
+ line 2.
at (eval 13)[/usr/share/perl/5.28/perl5db.pl:738] line 2.
eval 'no strict; ($@, $!, $^E, $,, $/, $\\, $^W) = @DB::saved;pack
+age main; $^D = $^D | $DB::db_stop;
if ( $str =~ /(\\\\x{[A-F\\d]+})/i ) { print $1 };
' called at /usr/share/perl/5.28/perl5db.pl line 738
DB::eval called at /usr/share/perl/5.28/perl5db.pl line 3138
DB::DB called at -e line 1
\x{A3f4}
Can you "see" the layering of this, because I cannot. Q3) Is there a setting for the debugger that allows for more human readable error output, maybe a newline between layers?
Q4) Why is any part of perl5db.pl asking itself this question:
eval 'no strict; ($@, $!, $^E, $,, $/, $\\, $^W) = @DB::saved;package
+main; $^D = $^D | $DB::db_stop;
if ( $str =~ /(\\\\x{[A-F\\d]+})/i ) { print $1 };
There are 4 backslashes before that x. I know this is a situation of garbage in, but how is this the garbage out?
DB<5> $str = '123X12'
+
DB<6> p $str
+
123X12
DB<7> if ( $str =~ /^(\d{2,4})[^\d](\d{2})/) { print "$1;$2" }
+
123;12
DB<8> $str = '123{12'
+
DB<9> if ( $str =~ /^(\d{2,4})[^\d](\d{2})/) { print "$1;$2" }
+
123;12
Well, the rest of this makes sense to me, and it shows a use of the curly braces that I might know. I wouldn't understand it without working through it with the REPL. One final question:
Q5) Is it said correctly that perl is written in c, but the perl debugger is written in perl?
Gruss aus Amiland