PPI 对 perl 的 heredoc 的标记化不正确

Incorrect tokenizing of perl's heredoc by PPI

我正在使用 PPI 来标记 perl 文件。然而,heredoc 似乎没有被正确标记。我正在使用以下代码来标记文件:

my $file_name = shift @ARGV;

use PPI;
use PPI::Dumper;

my $Document = PPI::Document->new($file_name);

my $Dumper = PPI::Dumper->new($Document);

$Dumper->print;

__END__

下面是被标记化的 perl 文件:

my $name = 'Foo';
 
my $message = <<'END_MESSAGE';
Dear $name,
 
this is a message I plan to send to you.
 
regards
  the Perl Maven
END_MESSAGE
 
print $message;

我得到以下输出:

PPI::Document
  PPI::Statement::Variable
    PPI::Token::Word    'my'
    PPI::Token::Whitespace      ' '
    PPI::Token::Symbol      '$name'
    PPI::Token::Whitespace      ' '
    PPI::Token::Operator    '='
    PPI::Token::Whitespace      ' '
    PPI::Token::Quote::Single   ''Foo''
    PPI::Token::Structure   ';'
  PPI::Token::Whitespace    '\n'
  PPI::Token::Whitespace    ' \n'
  PPI::Statement::Variable
    PPI::Token::Word    'my'
    PPI::Token::Whitespace      ' '
    PPI::Token::Symbol      '$message'
    PPI::Token::Whitespace      ' '
    PPI::Token::Operator    '='
    PPI::Token::Whitespace      ' '
    PPI::Token::HereDoc     '<<'END_MESSAGE''
    PPI::Token::Structure   ';'
  PPI::Token::Whitespace    '\n'
  PPI::Token::Whitespace    ' \n'
  PPI::Statement
    PPI::Token::Word    'print'
    PPI::Token::Whitespace      ' '
    PPI::Token::Symbol      '$message'
    PPI::Token::Structure   ';'
  PPI::Token::Whitespace    '\n'

有什么办法可以得到整个heredoc的值吗?

根据 documentation 此处文档的内容可通过 heredoc 方法获得:

my $Document = PPI::Document->new($file_name);
my @heredoc = $Document->find_first('PPI::Token::HereDoc')->heredoc;
say join "", @heredoc;

输出:

Dear $name,

this is a message I plan to send to you.

regards
  the Perl Maven