Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re: How to split "/"

by bigj (Monk)
on Apr 28, 2014 at 08:15 UTC ( [id://1084088]=note: print w/replies, xml ) Need Help??


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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1084088]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others meditating upon the Monastery: (4)
As of 2024-04-25 05:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found