(I'm asking for a friend.)
~
7.3. Expanding Tildes in Filenames
Problem
You want to open filenames like ~username/blah, but open doesn't interpret the tilde to mean a home directory.
Solution
Expand the filename manually with a substitution:
$filename =~ s{ ^ ~ ( [^/]* ) }
{ $1
? (getpwnam($1))[7]
: ( $ENV{HOME} || $ENV{LOGDIR}
|| (getpwuid($>))[7]
)
}ex;
Discussion
The uses of tilde that we want to catch are:
~user
~user/blah
~
~/blah
If no name follows the ~, the current user's home directory is used.
This substitution uses /e to evaluate the replacement as Perl code. If a username follows the tilde, it's stored in $1, which getpwnam uses to extract the user's home directory out of the return list. This directory becomes the replacement string. If the tilde was not followed by a username, substitute in either the current HOME environment variable or the LOGDIR one. If neither of those environment variables is valid, look up the effective user ID's home directory.