in reply to Processing array with suitable options

Don't use split; use a regular expression with capture groups.

#!/usr/bin/perl use 5.010; use strict; use warnings; my @pnames = <DATA>; for (@pnames) { chomp; / ^\s* # allow leading spaces \{(.+?)\} # IdentifyingNumber in braces \s+ # white space (.+?) # Name \s+ # white space ([0-9\.]+) # Version (allow numeric plus dot) \s*$ # allow trailing space /x or next; # skip lines not conforming to above pattern say "Got Identifying Number: $1"; say "Got Name: $2"; say "Got Version: $3"; say "----"; } __DATA__ IdentifyingNumber Name + Version {E094B8EA-87B7-48DE-A0A8-A18AC8BFCDF4} .NET Data Provider for Terada +ta 14.00.0.0 {1551F9D6-1B14-4AE1-BABA-70A4319C236A} ODBC Driver Provider + 14.00.0.0
package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name