« 自宅サーバの修復 | メイン | Squidのcache_dirの最適化 »

Path::Classでnew_absみたいな

ファイルシステムだから、単純にはいかないのだけれども、URIのnew_absの様なものが欲しい時がある。
Path::Classなら、両方ファイルだとして、

my $abs = Path::Class::file( Path::Class::file($base)->dir, $path );

ってやればできる。

File::Specなら

my $abs = File::Spec->rel2abs( $path, $base );

むしろこっちの方が単純だったか。。

↓上を利用してYAMLで外部ファイルをinclude

use YAML;
use Path::Class;

sub LoadFile {
    my $file  = shift;
    &_loadfile({}, $file );
}

sub _loadfile {
    my $args = shift;

    my $file = Path::Class::file( @_ );
    my $hashref = YAML::LoadFile($file);

    if ( $hashref->{include} ) {
        die "'include' must be array or scallar"
          if ( ref $hashref->{include} && ref $hashref->{include} eq "HASH");
        $hashref->{include} = [ $hashref->{include} ]
          unless ref $hashref->{include};
        my %include_hash;
        foreach my $include ( @{ delete $hashref->{include} } ) {
            my $include_hash = &_loadfile( $args, $file->dir, $include );
            %include_hash = ( %include_hash, %$include_hash );
        }
        $hashref = { %include_hash, %$hashref };
    }

    return $hashref;
}