PPI对perl的Heredoc进行不正确的标记化

问题描述 投票:2回答:1

我正在按顺序使用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的值吗?

perl tokenize
1个回答
0
投票

根据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
© www.soinside.com 2019 - 2024. All rights reserved.