#!/usr/bin/perl -w use strict; for my $str ( @ARGV ) { my @stack; my $list= []; for my $s ( $str =~ m/[()]|[^()]+/g ) { if( '(' eq $s ) { push @stack, $list; push @$list, []; $list= $list->[-1]; } elsif( ')' eq $s ) { if( ! @stack ) { die "Unmatched ')'"; } $list= pop @stack; } else { push @$list, $s; } } if( @stack ) { die 0+@stack, " unclosed '('s"; } warn "Done.\n"; }