NAME

Text::Parser::Rule - Makes it possible to write AWK-style parsing rules for Text::Parser

VERSION

version 1.000

SYNOPSIS

use Text::Parser;

my $parser = Text::Parser->new();
$parser->add_rule(
    if               => '$1 eq "NAME:"',      # Some condition string
    do               => 'return $2;',         # Some action to do when condition is met
    dont_record      => 1,                    # Directive to not record
    continue_to_next => 1,                    # Directive to next rule till another rule
);
$parser->read(shift);

DESCRIPTION

This class is never used directly. Instead rules are created and managed in one of two ways:

In both cases, the arguments are the same.

METHODS

condition

Read-write attribute accessor method. Returns a string with the condition string as supplied to the if clause in the constructor.

my $cond_str = $rule->condition();

Or modify the condition of a given rule:

$rule->condition($new_condition);

action

Read-write accessor method for the do clause of the rule. This is similar to the condition accessor method.

my $act_str = $rule->action;
$rule->action($modified_action);

dont_record

Read-write boolean accessor method for the dont_record attribute of the constructor.

print "This rule will not record\n" if $rule->dont_record;

continue_to_next

Read-write boolean accessor method for the continue_to_next attribute in the constructor.

print "Continuing to the next rule\n" if $rule->continue_to_next;

add_precondition

Method that can be used to add more pre-conditions to a rule

$rule->add_precondition('looks_like_number($1)');
# Check if the first field on line is a number

When you call test on the rule, it tests all the pre-conditions and the regular condition. If any of them fail, the test returns a boolean false.

This method is very useful when you clone a rule.

test

Method called internally in Text::Parser. Runs code in if block.

print "I will run the task of the rule\n" if $rule->test;

run

Method called internally in Text::Parser. Runs code in do block, and saves the result as a record depending on dont_record.

my $result = $rule->run();

CONSTRUCTOR

new

Instances of this class can be created using the new constructor, but normally a user would never create a rule themselves:

my $rule = Text::Parser::Rule->new(
    if               => '# some condition string', 
    do               => '# some task rule', 
        # At least one of the above two clauses must be specified
        # When not specified, if clause defaults to 1
        # When not specified, do clause defaults to 'return $_;'
    dont_record      => 1, # default: 0
    continue_to_next => 1, # default: 0
);

clone

You can clone a rule and construct another rule from it.

$new_rule = $rule->clone();
 # Just creates a clone of $rule.

The above is not particularly useful as it just creates a copy of the same rule. In the below example, we demonstrate that any of the four main attributes of a rule could be changed while creating a clone. For example:

$rule = Text::Parser::Rule->new(
    if               => '# some condition',
);
$new_rule = $rule->clone(
    # all of these are optional
    do               => '# modify original action', 
    dont_record      => 1, 
    continue_to_next => 1,
);

You could also change the if clause above, but you could also add a pre-condition at the time of creating $new_rule without affecting $rule itself:

$new_rule = $rule->clone(
    add_precondition => '# another condition',
    # ...
);

The clone method is just another way to create a rule. It just uses an existing rule as a seed.

SEE ALSO

BUGS

Please report any bugs or feature requests on the bugtracker website http://github.com/balajirama/Text-Parser/issues

When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.

AUTHOR

Balaji Ramasubramanian <balajiram@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2018-2019 by Balaji Ramasubramanian.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.