I have a Perl variable I populate from the database. Its name is $path
. I need to get another variable $file
which has just the filename from the pathname.
I tried:
$file = $path =~ s/.*\///;
I am very new to Perl.
Why reinvent the wheel? Use the File::Basename module:
use File::Basename;
...
$file = basename($path);
Why did $file=$path=~s/.*\///;
not work?
=~
has higher precedence than =
So
$file = $path =~s/.*\///;
is treated as:
$file = ($path =~s/.*\///);
which does the replacement in $path
and assigns either 1
(if replacement occurs) or ''
(if no replacement occurs).
What you want is:
($file = $path) =~s/.*\///;
which assigns the value of $path
to $file
and then does the replacement in $path
.
But again there are many problems with this solution:
It is incorrect. A filename in Unix based systems (not sure about Windows) can contain newline. But .
by default does not match a newline. So you'll have to use a s
modifier so that .
matches newline as well:
($file = $path) =~s/.*\///s;
Most importantly it is not portable as it is assuming /
is the path separator which is not the case with some platforms like Windows (which uses \
), Mac (which uses :
). So use the module and let it handle all these issues for you.
use File::Basename
Check the below link for a detailed description on how it works:
http://p3rl.org/File::Basename
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With