in reply to Finding a capitalised pair of words in a text

@word =~ m/\w{2}/i;

You have a pattern match in void context so whether or not it matched you are not doing anything with the result.    The binding operator (=~) uses two scalar operands so the array is used in scalar context which means that if @word contains 7 elements then your pattern match is "7" =~ m/\w{2}/i;.    Your pattern uses the \w character class which includes all upper and lower case letters so the use of the /i option is superfluous.

foreach my $word (@word) { if ($word =~ m/^[A-Z]/) { if ($word[0] ne "[Sidenote:") { $name = $word[0]." ".$word[1];

You are iterating through every element in @word and storing each in turn in the $word variable but you are always comparing only the first element of @word with "[Sidenote:" and assigning to $name only the first and second elements of @word every time.

It sounds like you probably want to use a pattern something like:

my @names = $letter =~ /\b[A-Z][a-zA-Z]+\s+[A-Z][a-zA-Z]+/g;