The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Regexp::Bind - Bind variables to captured buffers

SYNOPSIS

  use Regexp::Bind qw(
                      bind
                      global_bind
                     );

  $record = bind($string, $regexp, @fields);
  @record = global_bind($string, $regexp, @fields);

  $record = bind($string, $embedded_regexp);
  @record = global_bind($string, $embedded_egexp);

DESCRIPTION

This module is an extension to perl's native regexp function. It binds an anonymous hash or named variables to matched buffers. Both normal regexp syntax and embedded regexp syntax are supported. You can view it as a tiny and petite data extraction system.

FUNCTIONS

Two functions are exported. They bind the given fields to captured contents, and return an anonymous hash of the fields.

Match the first occurrence

  use Data::Dumper;

  $record = bind($string, $regexp, qw(field_1 field_2 field_3));
  print Dumper $record;

Do global matching and store matched parts in @record

  @record = global_bind($string, $regexp, qw(field_1 field_2 field_3));
  print Dumper $_ foreach @record;

NAMED VARIABLE BINDING

To use named variable binding, please set $Regexp::Bind::USE_NAMED_VAR to non-undef, and then matched parts will be bound to named variables while using bind(). It is not supported for global_bind().

  $Regexp::Bind::USE_NAMED_VAR = 1;
  bind($string, $regexp, qw(field_1 field_2 field_3));
  print "$field_1 $field_2 $field_3\n";

EMBEDDED REGEXP

Using embedded regexp syntax means you can embed fields right in regexp itself. Its embedded syntax exploits the feature of in-line commenting in regexps.

The module first tries to detect if embedded syntax is used. If detected, then comments are stripped and regexp is turned back to a simple one.

Using embedded syntax, field's name is restricted to alphanumerics only.

Example:

  bind($string, qr'# (?#<field_1>\w+) (?#<field_2>\d+)\n'm);

is converted into

  bind($string, qr'# (\w+) (\d+)\n'm);

If embedded syntax is detected, further input arguments are ignored. It means that

  bind($string, qr'# (?#<field_1>\w+) (?#<field_2>\d+)\n'm,
       qw(field_1 field_2));

is the same as

  bind($string, qr'# (?#<field_1>\w+) (?#<field_2>\d+)\n'm);

or

  bind($string, qr'# (\w+) (\d+)\n'm);

Note that the module simply replaces (?#<field name> with ( and binds the field's name to buffer. It does not check for syntax correctness, so any fancier usage may crash.

SEE ALSO

For a similar functionality, see Regexp::Fields.

See also test.pl for an example.

COPYRIGHT

Copyright (C) 2004 by Yung-chung Lin (a.k.a. xern) <xern@cpan.org>

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself