Ganesh Bharadwaj1 has asked for the wisdom of the Perl Monks concerning the following question:

Dear monks, I have a file which contains one line. {31 0} {26 0} {6 10} {17 0} I want to type
I am 31 years and 0 months old. I am 26 years and 0 months old. I am 6 years and 10 months old. I am 17 years and 0 months old.
in another file. I am not sure on how to split using multiple delimiters, as in based on { and } and how to save these data into arrays. Any help would be greatly appreciated.

Replies are listed 'Best First'.
Re: spliting a string based on multiple delimiters and printing required o/p.
by Corion (Patriarch) on Feb 29, 2016 at 10:02 UTC

    What have you tried and how did it fail for you?

    For example, you could split on {, } and whitespace, and discard all empty elements.

Re: spliting a string based on multiple delimiters and printing required o/p.
by Laurent_R (Canon) on Feb 29, 2016 at 14:01 UTC
    Perhaps one of these one-liners:
    $ perl -E '$_= "{31 0} {26 0} {6 10} {17 0}"; say "I am $1 years and $ +2 month old" while /\{(\d+)\s+(\d+)\}/g;' I am 31 years and 0 month old I am 26 years and 0 month old I am 6 years and 10 month old I am 17 years and 0 month old
    Or:
    $ perl -E '$_= shift; say "I am $1 years and $2 month old" while /\{(\ +d+)\s+(\d+)\}/g; ' "{31 0} {26 0} {6 10} {17 0}" I am 31 years and 0 month old I am 26 years and 0 month old I am 6 years and 10 month old I am 17 years and 0 month old
Re: spliting a string based on multiple delimiters and printing required o/p.
by Discipulus (Canon) on Feb 29, 2016 at 10:49 UTC
    Hello Ganesh Bharadwaj1,

    split can do it's work using a regex so you can try a regex with group of chars to do the job. Consider this example (but notice a first empy element!):

    #win quotation perl -e "print join '|',split /[{}\s]+/,$ARGV[0]" "{31 0} {26 0} {6 10 +} {17 0}" |31|0|26|0|6|10|17|0

    Or a global silly substitution like:

    perl -e "print map{s/\s?{/I am /g;s/(\d{1,3})\s/$1 years old and /g;s/ +(\d{1,3})}/$1 months old.\n/g;qq($_\n)}@ARGV" "{31 0} {26 0} {6 10} {17 0}" I am 31 years old and 0 months old. I am 26 years old and 0 months old. I am 6 years old and 10 months old. I am 17 years old and 0 months old.

    But it really depends on your needs and skill, what have you tried so far?

    L*

    There are no rules, there are no thumbs..
    Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
Re: spliting a string based on multiple delimiters and printing required o/p.
by Anonymous Monk on Feb 29, 2016 at 10:27 UTC

    Also have a look at the function extract_bracketed from the core module Text::Balanced.

      ++Anonymous, and it becomes frequent too!

      Use the source Luke,
      Know your own core Peaches..

      L*

      There are no rules, there are no thumbs..
      Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.