Is Perl compiled or interpreted?
It's a VM that can also be compiled without the need of C. Its VM however is light years faster than Java so there really isn't anything that compares to it.
The bad - Its terrible in the same way C++ pushes to be a be all end all swiss army knife. In Perls case it removes the training wheels, safety and borders. For example in most OOP languages you must declare a class before you can use an object, in Perl there are no restrictions on types you can mix and match anything thereby turning anything into an object or an object into anything. The concept is confusing as hell if you already know OOP, the lack of restrictions is both powerful and a drawback in Perl. So whether the language is compiled or not isn't the issue so much as can you actually reason something effectively without braking the world. Another issue is that Perl is write only thus everything looks like gibberish once written and becomes difficult to dissect and even debug.
Both. Perl5 compiles the source code into OPCODE objects, then interprets the OPCODE objects. Long answer follows.
From Wikipedia,
A compiler is a computer program (or set of programs) that transforms source code written in a programming language (the source language) into another computer language (the target language, often having a binary form known as object code).
Perl5 is a compiler. It takes Perl5 source code and produces of a graph of OPCODE objects.
$ perl -MO=Concise,-exec -E'for (1..3) { say "Hello, World!" }'
1 <0> enter
2 <;> nextstate(main 48 -e:1) v:%,2048
3 <0> pushmark s
4 <$> const(IV 1) s
5 <$> const(IV 3) s
6 <$> gv(*_) s
7 <{> enteriter(next->c last->f redo->8) lKS/8
d <0> iter s
e <|> and(other->8) vK/1
8 <;> nextstate(main 47 -e:1) v:%,2048
9 <0> pushmark s
a <$> const(PV "Hello, World!") s
b <@> say vK
c <0> unstack v
goto d
f <2> leaveloop vK/2
g <@> leave[1 ref] vKP/REFC
-e syntax OK
However, the Perl5 compiler does not produce machine code. So how is the OPCODE graph executed? From Wikipedia, one definition for an interpreter is something that
explicitly executes stored precompiled code made by a compiler which is part of the interpreter system
This means the OPCODE graphs is interpreted.
Work was being down to provide the option to compile Perl5 to LLVM bytecode. This, in turn, can be jit compiled into machine code. This is the same approach Java uses.
From Wikipedia: "Perl is a high-level, general-purpose, interpreted, dynamic programming language". Perl 6 allows also for compilation (again, see Wikipedia).