Data::Munge(3pm) | User Contributed Perl Documentation | Data::Munge(3pm) |
Data::Munge - various utility functions
use Data::Munge; my $re = list2re qw/f ba foo bar baz/; # $re = qr/bar|baz|foo|ba|f/; print byval { s/foo/bar/ } $text; # print do { my $tmp = $text; $tmp =~ s/foo/bar/; $tmp }; foo(mapval { chomp } @lines); # foo(map { my $tmp = $_; chomp $tmp; $tmp } @lines); print replace('Apples are round, and apples are juicy.', qr/apples/i, 'oranges', 'g'); # "oranges are round, and oranges are juicy." print replace('John Smith', qr/(\w+)\s+(\w+)/, '$2, $1'); # "Smith, John" my $trimmed = trim " a b c "; # "a b c" my $x = 'bar'; if (elem $x, [qw(foo bar baz)]) { ... } my $contents = slurp $fh; # or: slurp *STDIN eval_string('print "hello world\\n"'); # says hello eval_string('die'); # dies eval_string('{'); # throws a syntax error my $fac = rec { my ($rec, $n) = @_; $n < 2 ? 1 : $n * $rec->($n - 1) }; print $fac->(5); # 120 if ("hello, world!" =~ /(\w+), (\w+)/) { my @captured = submatches; # @captured = ("hello", "world") }
This module defines a few generally useful utility functions. I got tired of redefining or working around them, so I wrote this module.
my $re = list2re keys %hash; $str =~ s/($re)/$hash{$1}/g;
This function takes special care to get several edge cases right:
foo(byval { s/!/?/g } $str); # Calls foo() with the value of $str, but all '!' have been replaced by '?'. # $str itself is not modified.
Since perl 5.14 you can also use the "/r" flag:
foo($str =~ s/!/?/gr);
But "byval" works on all versions of perl and is not limited to "s///".
my @foo = mapval { chomp } @bar; # @foo contains a copy of @bar where all elements have been chomp'd. # This could also be written as chomp(my @foo = @bar); but that's not # always possible.
Note that these aren't variables; they're character sequences interpreted by "replace".
If REPLACEMENT is a subroutine reference, it's called with the following arguments: First the matched substring (like $& above), then the contents of the capture buffers (as returned by "submatches"), then the offset where the pattern matched (like "$-[0]", see "@-" in perlvar), then the STRING. The return value will be inserted in place of the matched substring.
Normally only the first occurrence of REGEX is replaced. If FLAG is present, it must be 'g' and causes all occurrences to be replaced.
This is implemented as a linear search through ARRAYREF that terminates early if a match is found (i.e. "elem 'A', ['A', 1 .. 9999]" won't even look at elements "1 .. 9999").
my $foo = "Hello, world!\n"; eval_string 'print $foo'; # Dies: Global symbol "$foo" requires explicit package name
That is, the eval'd code can't see variables from the scope of the "eval_string" call.
"slurp $handle" is equivalent to "do { local $/; scalar readline $handle }".
my $code = rec { my ($rec, $n) = @_; $rec->($n - 1) if $n > 0; print $n, "\n"; }; $code->(4);
That is, when the sub is called, an implicit first argument is passed in $_[0] (all normal arguments are moved one up). This first argument is a reference to the sub itself. This reference could be used to recurse directly or to register the sub as a handler in an event system, for example.
A note on defining recursive anonymous functions: Doing this right is more complicated than it may at first appear. The most straightforward solution using a lexical variable and a closure leaks memory because it creates a reference cycle. Starting with perl 5.16 there is a "__SUB__" constant that is equivalent to $rec above, and this is indeed what this module uses (if available).
However, this module works even on older perls by falling back to either weak references (if available) or a "fake recursion" scheme that dynamically instantiates a new sub for each call instead of creating a cycle. This last resort is slower than weak references but works everywhere.
Lukas Mai, "<l.mai at web.de>"
Copyright 2009-2011, 2013-2015 Lukas Mai.
This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.
See http://dev.perl.org/licenses/ for more information.
2022-11-19 | perl v5.36.0 |