in reply to Custom sort with string of numbers

Use the logical or operator, not the logical and operator (consider what the cmp and <=> operators return!).

Also, you could split once per string per sort. Or, better (for performance, though not necessarily for memory usage), use a Schwartzian transform so you only split once per string:

@bar = map { $$_[0] } sort { $$a[1] <=> $$b[1] || $$a[2] <=> $$b[2] || $$a[3] <=> $$b[3] } map { [$_, split/-/] } @foo;
This also helps keep the "what I'm splitting" and "what I'm sorting" code clear by separating them.