In addition to
moritz's comment, be aware that the
//x modifier used in your posted code with the
/module (\w+) \{ ($parens) \};?/gx regex means that whitespace is a comment, so you are looking for "the substring
'module', followed
immediately by one or more
\w characters, followed
immediately by a
'{' character, etc..."
As moritz said, lexical variables do not play well with the (??{ code }) Extended Patterns variant; it is really intended to work with package variables. The following works for me (note that $parens is a fully local-ized package variable):
use warnings;
use strict;
use constant DENT => ' ';
our $parens;
my $text = do { local $/; <DATA> };
sub parse {
my ($text, $indent) = @_;
$indent = 0 unless defined $indent;
local $parens = qr{ (?: [^{}]+? | \{ (??{$parens}) \} )* }xms;
while ($text =~ /module \s+ (\w+) \s* \{ ($parens) \} ;? /gx) {
my ($name, $content) = ($1, $2);
print DENT x $indent, qq(subgraph $name { \n);
++$indent;
parse($content, $indent);
print DENT x $indent, qq(} \n);
--$indent;
}
}
# print $text; # FOR DEBUG
print "digraph G\n{\n";
parse($text);
print "}\n";
__DATA__
module abc
{
module def
{
module ghi
{ module jkl {}
};
};
};
Output:
digraph G
{
subgraph abc {
subgraph def {
subgraph ghi {
subgraph jkl {
}
}
}
}
}
Updates:
- Run under ActiveState Perl 5.8.2.808.
- Quoted regex narration for clarity.
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.