Thanks, that's a good detail I'd missed: > You can also use .parent(3) as a shorthand for .parent.parent.parent or > .add('../../../').resolve
And I'd never even noticed ^add_fallback existed... that's a peculiar one. And not classified as a MONKEY trick, eh? On 3/30/21, Matthew Stuckwisch <ma...@softastur.org> wrote: > 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? > >