Rand Stats

Env

zef:lizmat

Actions Status

NAME

Raku port of Perl's Env module

SYNOPSIS

use Env;
use Env <PATH HOME TERM>;
use Env <$SHELL @LD_LIBRARY_PATH>;

DESCRIPTION

This module tries to mimic the behaviour of Perl's Env module as closely as possible in the Raku Programming Language.

Raku maintains environment variables in a special hash named %*ENV. For when this access method is inconvenient, the Raku module Env allows environment variables to be treated as scalar or array variables.

The Env binds environment variables with suitable names to "our" Perl variables with the same names. By default it binds all existing environment variables (%*ENV.keys) to scalars. If names are specified, it takes them to be a list of variables to bind; it's okay if they don't yet exist. The scalar type prefix '$' is inferred for any element of this list not prefixed by '$' or '@'. Arrays are implemented in terms of split and join, using $*DISTRO.path-sep as the delimiter.

After an environment variable is bound, merely use it like a normal variable. You may access its value

@path = split(':', $PATH);
say join("\n", @LD_LIBRARY_PATH);

or modify it

$PATH .= ":.";
push @LD_LIBRARY_PATH, $dir;

however you'd like. Bear in mind, however, that each access to a bound array variable requires splitting the environment variable's string anew.

The code:

use Env <@PATH>;
push @PATH, '.';

is equivalent to:

use Env <PATH>;
$PATH .= ":.";

except that if $*ENV{PATH} started out empty, the second approach leaves it with the (odd) value ":.", but the first approach leaves it with ".".

To remove a bound environment variable from the environment, undefine it:

undefine $PATH;
undefine @LD_LIBRARY_PATH;

IDIOMATIC PERL 6 WAYS

If you're only interested in a few environment variables to be exported to your lexical context as constants, you can use the auto-destructuring feature of signatures in Raku:

my (:$PATH, :$SHELL, *%) := %*ENV;

This will still collide with already defined variables (such as $_). This can be circumvented by creating a new scope:

given %*ENV -> (:$_, :$PATH, *%) {
    dd $_, $PATH
}

AUTHOR

Elizabeth Mattijsen liz@raku.rocks

Source can be located at: https://github.com/lizmat/Env . Comments and Pull Requests are welcome.

COPYRIGHT AND LICENSE

Copyright 2018, 2019, 2020, 2021 Elizabeth Mattijsen

Re-imagined from Perl as part of the CPAN Butterfly Plan.

This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.