Rather than index, which will not accept a pattern, use a character class in a capturing regex, match globally in a while loop and use the @- array, see perlvar. Note that a hyphen (-) in a character class has to be the first or last character or it will be interpreted as a range constructor, e.g. [a-z].

$ perl -E '
> $line =
> q{The line, as specified, has: no digits (0 to 9); letters!};
> say qq{>$1< found at $-[ 0 ]} while
> $line =~ m{([ (),.;:?!-])}g;'
> < found at 3
>,< found at 8
> < found at 9
> < found at 12
>,< found at 22
> < found at 23
>:< found at 27
> < found at 28
> < found at 31
> < found at 38
>(< found at 39
> < found at 41
> < found at 44
>)< found at 46
>;< found at 47
> < found at 48
>!< found at 56
$

If 5.10+ is available, use of the //p regex modifier allows ${^MATCH} (and friends) to be used eliminating the need for an explicit capture and perhaps slightly speeding the matching:

>perl -wMstrict -lE
"my $line = q{as specified, line has: no digits (0-9); letters!};
;;
say qq{'${^MATCH}' found at $-[0]}
while $line =~ m{ [ (),.;:?!-] }xmsgp;
"
' ' found at 2
',' found at 12
' ' found at 13
' ' found at 18
':' found at 22
' ' found at 23
' ' found at 26
' ' found at 33
'(' found at 34
'-' found at 36
')' found at 38
';' found at 39
' ' found at 40
'!' found at 48

When putting a smiley right before a closing parenthesis, do you:

Use two parentheses: (Like this: :) )
Use one parenthesis: (Like this: :)
Reverse direction of the smiley: (Like this: (: )
Use angle/square brackets instead of parentheses
Use C-style commenting to set the smiley off from the closing parenthesis
Make the smiley a dunce: (:>
I disapprove of emoticons
Other