#!/usr/bin/perl use 5.016; use warnings; # 1059623 # select lines which do not have : at the first word. my @arry=( 'bond0.2 Link encap:Ethernet', 'bond4.3:6 Link encap:Ethernet', 'bond3 Link encap:Ethernet', 'bond5:0 Link encap:Ethernet', 'bond1.5:2 Link encap:Ethernet', 'bond2.6 Link encap:Ethernet' ); my $elem; for $elem(@arry) { if($elem =~ /(bond[^:]+?)\s+Link.*$/) { # note negated char class, minimally my $match = $1; # You may find it 'good practice' to extract # any value in $1 to another var ASAP say $match . " The colon, if any, is AFTER the first word \n\tin | \"$elem\" |"; } else { say "Matching colon in first word (ie, before a space)\n\t in | \"$elem\" |"; } } =head C:\>1059623.pl bond0.2 The colon, if any, is AFTER the first word in | "bond0.2 Link encap:Ethernet" | Fails OP's criterion; matching colon in first word (ie, before a space) in | "bond4.3:6 Link encap:Ethernet" | bond3 The colon, if any, is AFTER the first word in | "bond3 Link encap:Ethernet" | Fails OP's criterion; matching colon in first word (ie, before a space) in | "bond5:0 Link encap:Ethernet" | Fails OP's criterion; matching colon in first word (ie, before a space) in | "bond1.5:2 Link encap:Ethernet" | bond2.6 The colon, if any, is AFTER the first word in | "bond2.6 Link encap:Ethernet" | C:\> =cut