in reply to Re: Removing File Extensions
in thread Removing File Extensions

The above fails if there's no extension too.

This works:

@files = ("one.zip","twotwo.doc","three3.ppt","testfour"); map {$_ =~ /([^.]*)\.?/; push (@onlyNames, $1); push (@onlyExt, $');} +@files;

Replies are listed 'Best First'.
Re: Re: Re: Removing File Extensions
by davido (Cardinal) on May 02, 2004 at 06:45 UTC
    This works:

    @files = ("one.zip","twotwo.doc","three3.ppt","testfour"); map {$_ =~ /([^.]*)\.?/; push (@onlyNames, $1); push (@onlyExt, $');} +@files;

    No, it doesn't always work. It fails if the filename is part of a complete path.

    Consider the following input, which will cause a complete path instead of a filename to be pushed into your @onlyNames array:

    /usr/bin/perl /home/users/d/davido/text.txt C:\Perl\scripts\mytest.pl

    In each of those cases, you'll capture into @onlyNames the following:

    /usr/bin/perl /home/users/d/davido/text C:\Perl\scripts\mytest

    It gets even worse if one of the directory names in the path contains a dot (.)

    Consider what happens if the input looks like this:

    C:\Perl\scripts.old\mytest.pl

    In that case, @onlyNames will contain:

    C:\Perl\scripts

    And clearly that's not a filename.

    Update: Just thought of another situation that may reveal a bug: What if the filename has multiple extensions? In this case, it would be up to the OP to define what constitutes an extension, and what constitutes a filename. But by way of example, your solution would turn:

    bigfile.tar.gz

    ...into...

    bigfile

    The danger here is that while .gz represents the extension, .tar represents a second layer of 'extension'. But the name of the .gz file really is bigfile.tar, since we're dealing with multiple layers of processing on the said file.


    Dave

    A reply falls below the community's threshold of quality. You may see it by logging in.