You need to start by studying Perl's concept of context.
The short version is that operators are evaluated in list, scalar or void context. The context of an operator is determined by the operator of which it is an operand.
In list context, an operator may return any number (0 or more) scalars.
In scalar context, an operator must return exactly one scalar (no more, no less).
In void context, the scalars returned by an operator are discarded.
Operators can and do and return different values depending on the context. Any operator that nominally returns multiple scalars must necessarily return something different in list context and scalar context.
Now that you've studied Perl's concept of context, I'll cover how it applies to the list/comma operator.
To do that, we'll look at these two statements.
my @a = (1,2,3);
my $s = (1,2,3);
Note that all ( ) does is change precedence like ( ) in mathematics. It doesn't result in any code. It doesn't create any kind of data structure.
In the first case, we have a list assignment operator. It evaluates its right-hand side operand in list context. This means that 1,2,3 is evaluated in list context.
In list context, 1,2,3 evaluates each item of the list in list context, and returns every scalar produced. As such, it returns 1, 2 and 3.
In the second case, we have a scalar assignment operator. It evaluates its left-hand side operand in scalar context. This means that 1,2,3 is evaluated in scalar context.
In scalar context, 1,2,3 evaluates each item but the last in void context, then evaluates the last item in scalar context, and returns the scalar produced by the last time. As such, it's effectively short for do { 1;2;3 }, and it returns 3.
Finally, let's examine the context of each operator in the expressions you provided.
The perl debugger evaluates provided code in list context.
or imposes a scalar context on its left-hand side operand.
[ ] evaluates its initializaing expression in list context.
eval propagates its context to the last statement of the block.
eval{(1,2,3)} or do {}
# Order Context Operator Produces
# ----- ------- ------------- --------
# 6 list or 3
# 5 scalar eval 3
# 4 scalar , 3
# 1 void 1 <nothing>
# 2 void 2 <nothing>
# 3 scalar 3 3
# - list do <not evaluated>
eval{[1,2,3]} or do {}
# Order Context Operator Produces
# ----- ------- ------------- --------
# 7 list or ref to array
# 6 scalar eval ref to array
# 5 scalar [] ref to array
# 4 list , 1 and 2 and 3
# 1 list 1 1
# 2 list 2 2
# 3 list 3 3
# - list do <not evaluated>
eval{(1,2,3)}
# Order Context Operator Produces
# ----- ------- ------------- --------
# 5 list eval 1 and 2 and 3
# 4 list , 1 and 2 and 3
# 1 list 1 1
# 2 list 2 2
# 3 list 3 3
eval{[1,2,3]}
# Order Context Operator Produces
# ----- ------- ------------- --------
# 6 list eval ref to array
# 5 list [] ref to array
# 4 list , 1 and 2 and 3
# 1 list 1 1
# 2 list 2 2
# 3 list 3 3