http://www.perlmonks.org?node_id=1065348


in reply to foreach loop on one line

Is this not valid code?

Very close, but no, it's not. You need a code block with that foreach, as it is:

do { print "$_ could not be restored!\n" unless ( exists $found{$_} ) +} foreach (@files);

or (more commonly)

foreach (@files) { print "$_ could not be restored!\n" unless ( exists $found{$_} ); }

or you could

exists $found{$_} or print "$_ could not be restored!\n" foreach @file +s;

Why does this last one work? An (inclusive) or statement is true iff one of its disjuncts is true. If exists $found{$_} is true, there's no need to evaluate the 'expression' on the other side of the or, because the entire or statement is true. However, if exists $found{$_} is not true, then the other side of the or will be evaluated, viz., print "$_ could not be restored!\n".

Hope this helps!