in reply to How to split "/"

A quick and dirty solution might be really to use something like my @path = split m:/:, "/home/temp/login"; Disadvantage of such a solution is that your code will break if a dirname contains a slash or you start working on Windows. If you really only want the relative dirnames, the following snippet will print them:
use File::Basename; my $d = "/home/temp/login"; my @b = (); while ($d ne dirname($d)) { # as long as we can move up directory t +ree, when we are at root the dirname won't change any more push @b, basename($d); $d = dirname($d) } print join "\n", reverse(@b)

Greetings,
Janek Schleicher

Update: Fixed a typo in script.

Replies are listed 'Best First'.
Re^2: How to split "/"
by RonW (Parson) on Apr 28, 2014 at 19:18 UTC
    A quick and dirty solution might be really to use something like my @path = split m:/:, "/home/temp/login"; Disadvantage of such a solution is that your code will break if a dirname contains a slash or you start working on Windows.

    Actually, / is not allowed in directory or file names. Windows disallows both \ and /

    FYI, Windows accepts both \ and / as separators:

    perl -e "print $ARGV[0] . ':';open(FH,$ARGV[0]) or die $ARGV[0] . ':' . $!;" dir/file.txt
      You're probably right, but I prefer defensive programming. In production code, I hate such assumptations, as there is always a chance that they will break in strange spots. Here, maybe a network drive on windows with double back slash like \\server or so might be nasty, or maybe the path might be in future something like ftp://home/temp/login. Maybe some internal stuff allows creating hidden anything with [/\\] inside, like perl allows us to create a sub "Hi with spaces inside" if we just manipulate the symbol table. I don't know for sure and won't know if something goes wrong why.

      So I try to advocate using modules that do exactly this job like File::Basename or Path::Tiny. At least, if those are much used modules, there is a lesser chance that things might go wrong.

      Of course, if I just write a snippet, I'd split m:[/\\]:, ... in a heart beat, also. No need to check a module doc if all you want is a short script that won't be used by other (persons/modules/programs).

      Greetings,
      Janek Schleicher

        True. My reply was meant to be informational. And, of course, there are still other platforms than POSIX/Linux/Unix and MS Windows.