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