in reply to Is this expected behavior for chomp/split...?!

split docs say By default, empty leading fields are preserved, and empty trailing ones are deleted. (If all fields are empty, they are considered to be trailing.)

For clarity, add

use Data::Dumper; print Data::Dumper->new([\@x])->Indent(0)->Useqq(1)->Dump, "\n";
You'll get
Split without chomp: 8 fields. $VAR1 = ["A","B","C","D","","","","\n"]; Split _after_ chomp: 4 fields. $VAR1 = ["A","B","C","D"];