>perl -wMstrict -le "unshift @ARGV, 'not foo camelCase NOT BAR namesCanBeDifferent oK Not Baz'; ;; for (@ARGV) { print qq{'$_'}; s{ ([[:lower:]]*) ((?<=[[:lower:]]) [[:upper:]][[:lower:]]*) } {\U$1_$2}xmsg; print qq{'$_' \n}; } " "aB aB aB" " aB " "aBc aBc aBc" " aBc " "No No No" " No " "Not Not Not" " Not " 'not foo camelCase NOT BAR namesCanBeDifferent oK Not Baz' 'not foo CAMEL_CASE NOT BAR NAMES_CAN_BE_DIFFERENT O_K Not Baz' 'aB aB aB' 'A_B A_B A_B' ' aB ' ' A_B ' 'aBc aBc aBc' 'A_BC A_BC A_BC' ' aBc ' ' A_BC ' 'No No No' 'No No No' ' No ' ' No ' 'Not Not Not' 'Not Not Not' ' Not ' ' Not '