From 5860e507e1f287301f7302603f3ebb09dfd3771b Mon Sep 17 00:00:00 2001 From: Ricardo Signes Date: Thu, 3 Jul 2025 16:30:46 -0400 Subject: [PATCH] escape_chars: add support for nonprintable --- lib/Data/Printer/Common.pm | 5 +++-- lib/Data/Printer/Object.pm | 2 +- t/002-scalar.t | 11 ++++++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/Data/Printer/Common.pm b/lib/Data/Printer/Common.pm index ac7d256..da760a5 100644 --- a/lib/Data/Printer/Common.pm +++ b/lib/Data/Printer/Common.pm @@ -121,8 +121,9 @@ sub _escape_chars { my $escape_kind = $ddp->escape_chars; my %target_for = ( - nonascii => '[^\x{00}-\x{7f}]+', - nonlatin1 => '[^\x{00}-\x{ff}]+', + nonascii => '[^\x{00}-\x{7f}]+', + nonlatin1 => '[^\x{00}-\x{ff}]+', + nonprintable => '\P{Print}', ); if ($ddp->unicode_charnames) { diff --git a/lib/Data/Printer/Object.pm b/lib/Data/Printer/Object.pm index 1e21806..30c5a4a 100644 --- a/lib/Data/Printer/Object.pm +++ b/lib/Data/Printer/Object.pm @@ -146,7 +146,7 @@ sub _init { $props, 'escape_chars', 'none', - [qw(none nonascii nonlatin1 all)] + [qw(none nonascii nonlatin1 nonprintable all)] ); $self->{'caller_info'} = Data::Printer::Common::_fetch_scalar_or_default($props, 'caller_info', 0); $self->{'caller_message'} = Data::Printer::Common::_fetch_scalar_or_default( diff --git a/t/002-scalar.t b/t/002-scalar.t index ac761b5..d7fadc4 100644 --- a/t/002-scalar.t +++ b/t/002-scalar.t @@ -2,7 +2,7 @@ # ^^ taint mode must be on for taint checking. use strict; use warnings; -use Test::More tests => 72; +use Test::More tests => 73; use Data::Printer::Object; use Scalar::Util; @@ -114,6 +114,15 @@ sub test_escape_chars { 'escaping nonascii' ); + # All the $string content is printable, so we'll add a non-printable + # character to see it escaped. + $object = Data::Printer::Object->new( colored => 0, escape_chars => 'nonprintable' ); + is( + $object->parse(\"\cX $string"), # ^X is U+0018, CANCEL + qq("\\x{18} $string"), + 'escaping nonprintable' + ); + $object = Data::Printer::Object->new( colored => 0, escape_chars => 'nonascii', unicode_charnames => 1 ); is( $object->parse(\$string),