如何使保存在变量“ $ = pod”中的pod行为?

时间:2019-05-13 07:50:17

标签: perl6 pod

是否可以将pod代码转换成保存在变量中的pod代码,使其在与pod2text一起使用时表现得像$=pod

#!/usr/bin/env perl6
use v6;
use Pod::To::Text;

my $code = $*PROGRAM.slurp;
my $pod = $code.subst( / ^ .+ \n <?before '=begin pod'> /, '' );

# convert $pod so it works with pod2text like $=pod does

say pod2text $pod;
say "==============";
say pod2text $=pod;

=begin pod

=head1 NAME

Test pod

=head1 DESCRIPTION

This is a test.

=end pod

2 个答案:

答案 0 :(得分:6)

The $=pod variable包含值的Array,每个值都是Pod::Block(的子类)的实例。因此,您需要复制它。

让Rakudo编译器完成所有工作

如果使用P6编译器编译某些P6代码,则应该自动编译其中的任何Pod,并且$=pod变量会自动初始化为包含Pod编译的结果。使用Rakudo:

=begin foo
foo-text
=end foo

say $=pod;

显示:

[Pod::Block::Named{:name("foo")}
  Pod::Block::Para
    foo-text
]

浏览了相关的编译器模块(grammaractionscompiling wrapper),我认为要花很多时间才能理解它。这种理解的结果可能是按原样使用其中一些代码的能力,但我怀疑,至少在不对编译器代码进行某种程度的重构的情况下,您同样有可能。

从头开始工作

以下$pod也将被pod2text接受:

my $pod =
  [Pod::Block::Named.new:
     :name("foo"),
     :contents[Pod::Block::Para.new:
       :contents["foo-text"]]];

say $pod; # displays same result as for `$=pod` above

解决方案?

想必您寻求的解决方案介于这些极端之间。

答案 1 :(得分:3)

您可以使用Pod::Load

这是您的程序:

use v6;
use Pod::To::Text;

=begin pod

=head1 NAME

Test pod

=head1 DESCRIPTION

This is a test.

=end pod

这是您加载它的地方:

use Pod::Load;

use Pod::To::Text;

my $pod = load( "get-pod.p6" );
dd $pod;

say pod2text $pod;

Perl6本身正在与程序的其余部分一起解析Pod,因此@raiph回答的内容也有效,因此,对于您在程序中使用的$ = pod。