Using $*PROGRAM.parent for the directory of the current script is what I've
always used, and it works well.
Note that if you do .add('../../../'), you may need to also call .resolve at
some point, but I generally just use .parent several times. (I think at worst
case I've only ever gone up two levels). You can also use .parent(3) as a
shorthand for .parent.parent.parent or .add('../../../').resolve
Also this just gave me the idea for having some fun with FALLBACK
IO::Path.^add_fallback(
anon method condition ($name) {
so $name ~~ /^(great)*grandparent$/
},
anon method calculator ($name) {
$name ~~ /^(great)*grandparent$/;
my $levels = 2 + $0;
anon method { self.parent($levels) }
}
);
my $file = IO::Path.new: "/etc/foo/bar/abc/xyz.txt";
say $file.parent; # "/etc/foo/bar/abc".IO
say $file.grandparent; # "/etc/foo/bar".IO
say $file.greatgrandparent; # "/etc/foo".IO
say $file.greatgreatgrandparent; # "/etc".IO
say $file.greatgreatgreatgrandparent; # "/".IO
> On Mar 29, 2021, at 7:50 PM, Joseph Brenner <[email protected]> wrote:
>
> I'm looking for the canoncial way to get the location
> of the currently running script (similar to perl's
> FindBin), so that I can specify other locations
> relative to the script location.
>
> This does what I want, but I see that the docs say
> that it's deprecated:
>
> my $loc = $*PROGRAM.chdir('..');
> chdir( $loc );
>
> The docs suggest using the .add method instead,
> But this does not at all do what I want:
>
> my $loc = $*PROGRAM.add('..');
> chdir( $loc );
>
> That tries to change the current location to:
>
> "/home/bozo/bin/mah_script.raku/.."
>
> And that fails, because the script name isn't a directory.
>
> Note: I could of course do my own surgey on $*PROGRAM
> to get the path to the script, but that at least used
> to be regarded as poor form for portability (e.g. the
> windows backslash separator vs the unix slash).
>
> This works fairly well:
>
> my $dir = $*PROGRAM.dirname;
> chdir( $dir );
>
> But it's a little disappointing I can't do this:
>
> my $dir = $*PROGRAM.dirname.add('../..');
>
> Because apparently "dirname" literally returns the
> name in string form:
>
> No such method 'add' for invocant of type 'Str'
>
> Ah, but I guess this works:
>
> my $new_loc = $*PROGRAM.parent.add('../../dat');
> chdir( $new_loc );
>
> So, does that look anything like the Right Way?