Я обнаружил, что ::STDIN
фактически дает мне доступ к потоку '-'
.И что я могу сохранить текущее местоположение через tell
( $inh )
, а затем seek
()
, когда я закончу.
Byиспользуя этот метод, я мог прочитать раздел __DATA__
в подпункте import
!
sub import {
my ( $caller, $file ) = ( caller 0 )[0,1];
my $yaml;
if ( $file eq '-' ) {
my $place = tell( ::STDIN );
local $RS;
$yaml = <::STDIN>;
seek( ::STDIN, $place, 0 );
}
else {
open( my $inh, '<', $file );
local $_ = '';
while ( defined() and !m/^__DATA__$/ ) { $_ = <$inh>; }
local $RS;
$yaml = <$inh>;
close $inh;
}
if ( $yaml ) {
my ( $config ) = YAML::XS::Load( $yaml );;
no strict 'refs';
while ( my ( $n, $v ) = each %$config ) {
*{"$caller\::$n"} = ref $v ? $v : \$v;
}
}
return;
}
Это работало на Strawberry Perl 5.16.2, поэтому я не знаю, насколько это переносимо.Но сейчас для меня это работает.
Просто фон.Раньше я немного программировал с помощью Windows Script Files.Одна вещь, которая мне понравилась в формате wsf, это то, что вы можете указывать глобально полезные объекты вне кода.<object id="xl" progid="Application.Excel" />
.Мне всегда нравился вид программирования по спецификации и позволяющий некоторому модульному обработчику сортировать данные.Теперь я могу получить аналогичное поведение через обработчик YAML: excel: !ActiveX: Excel.Application
.
Это работает для меня.
Тест здесь, если вам интересно:
use strict;
use warnings;
use English qw<$RS>;
use Test::More;
use data_mayhem; # <-- that's my module.
is( $k, 'Excel.Application' );
is( $l[1], 'two' );
{ local $RS;
my $data = <DATA>;
isnt( $data, '' );
say $data
}
done_testing;
__DATA__
---
k : !ActiveX Excel.Application
l :
- one
- two
- three