Одно отличие состоит в том, что do { ... }
возвращает значение, тогда как оператор if - нет (хотя см. Комментарии ниже.)
например:.
my $x = 3;
my $z = do { warn "in the do block"; 10 } if $x == 3;
Вы можете сделать почти то же самое с троичным оператором, хотя вы не можете упорядочить операторы внутри ветвей троичного оператора.