Re: How to split "/"
by Anonymous Monk on Apr 28, 2014 at 02:17 UTC
|
use Path::Tiny qw/ path /;
my $f = path( q(/home/temp/login));
while( not $f->is_rootdir ){
print join ' ', $f, $f->basename, "\n", ;
$f=$f->parent;
}
__END__
/home/temp/login login
/home/temp temp
/home home
| [reply] [d/l] |
Re: How to split "/"
by bigj (Monk) on Apr 28, 2014 at 08:15 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.
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. | [reply] [d/l] [select] |
|
|
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
| [reply] [d/l] |
|
|
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
| [reply] [d/l] [select] |
|
|
Re: How to split "/"
by Anonymous Monk on Apr 28, 2014 at 08:40 UTC
|
my $path = "/home/temp/login";
use File::Spec;
my @paths = File::Spec->splitdir($path);
print "\"$_\"\n" for @paths;
__END__
""
"home"
"temp"
"login"
The initial empty string at $paths[0] is due to the initial slash in the path (root directory). | [reply] [d/l] [select] |
Re: How to split "/"
by Laurent_R (Canon) on Apr 28, 2014 at 06:08 UTC
|
Or, if you want to do it yourself, you could possibly try this:
my @paths = grep { -d} glob ("/home/temp/login/*");
| [reply] [d/l] |
|
|
| [reply] [d/l] |
|
|
Yes, you are alsolutely right. I wonder how I could misread so thoroughly the question or forget its content before I wrote my post. I should probably have had another coffee this morning before coming to the monastery.
| [reply] |
Re: How to split "/"
by The_Ghost (Acolyte) on Apr 29, 2014 at 10:41 UTC
|
Try with this ( you can use it on windows )
my $path = '/home/temp//login' ;
my ( @parts ) = ( $path =~ /([\/\\]?\w+)(?(?=[\/\\]+\w+[\/\\]*?$)[\/\\
+]+)(?=$|[\/\\])?/g );
warn Dumper \@parts ;
Or with your variables
my ( $a, $b , $c ) = ...
| [reply] [d/l] [select] |