in reply to perl CGI: No such file or directory yet file exists???

Your OPEN statement :
open(GRADES,"<<$grades") ...
is incorrect - it is taking the second "<" as a part of the file name.

Follow graff's advice above., or (better), consider using local file handles in addition to the 3-arg open, and avoiding single-use throwaway variables:

open (my $grades, "<", $self->{gradefile}) or die ....
I might have gone further to suggest what I usually do - save the file handle as a part of the object, like:
open ( $self->{gradefh}, "<", $self->{gradefile})
but this makes it tricky to read/write the file - you need extra braces.

        "You're only given one little spark of madness. You mustn't lose it."         - Robin Williams