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 <doom...@gmail.com> 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?

Reply via email to