【问题标题】:Strip all comment from perl file using perl / PPR使用 perl / PPR 从 perl 文件中删除所有注释
【发布时间】:2020-08-01 00:10:39
【问题描述】:

我有一个包含以下内容的文件:

sub is_top_level0 { # with comment
print '\nFollowed by comment \n'; # The comment

# line from begin
}

基本上,我使用以下代码,其中 $sFilename 设置为正确的文件名:

use PPR;

    open(DATAIN, $sFilename);
    my @aFileData = map({ s/\r$//g; $_; } <DATAIN>);
    close (DATAIN);
    my $aRawFileData= \@aFileData;
    printf("Read:\n@{$aRawFileData}===============\n");
    my $aUncommentFileData = PPR::decomment($aRawFileData);
    printf("Uncomment:\n@{$aUncommentFileData}===============\n");

输出是:

Read:
sub is_top_level0 { # with comment
 print '\nFollowed by comment \n'; # The comment

 # line from begin
 }
===============
Uncomment:
sub is_top_level0 { # with comment
 print '\nFollowed by comment \n'; # The comment

 # line from begin
 }
===============

可以看出,名为“Uncomment”的部分仍然包含 cmets。

如何处理?

(注意问题可能听起来有点傻,但我不是perl程序员,只是想修改一些现有的代码)

编辑:正如我在@Dada 的答案的评论中所写的小说明(并且也已添加到答案中):

问题可能不够清楚,但我想在数组$aRawFileData$aUncommentFileData 中提供数据(使用行终止符\n),这样我就可以遍历数组(因为它是目前完成)。

【问题讨论】:

  • 提示:map({ s/\r$//g; $_; } &lt;DATAIN&gt;) 会比map { s/\r$//r } &lt;DATAIN&gt; 更清晰(假设您之前没有更改$/,因此/g 是无用的;否则添加/g)跨度>
  • 提示:使用词法文件句柄而不是全局句柄。 ,使用open my $DATAIN, '&lt;', $sFilename 而不是open DATAIN, '&lt;', $sFilename
  • 提示:使用 3 参数 open 而不是 2。ie,使用 open my $DATAIN, '&lt;', $sFilename 而不是 open my $DATAIN, '$sFilename'
  • 提示:检查open 是否成功。 ,做open my $DATAIN, '&lt;', $sFilename or die "Could not open $sFilename: $!"
  • 非常感谢您的提示,我会看看它,但我想在现有程序中尽可能少地更改(因为我不是 perl 程序员)。

标签: perl


【解决方案1】:

PPR::decomment 将字符串作为参数,参见文档:

它只有一个参数:包含课程代码的字符串

在这里,您在 $aRawFileData 上调用它,它是一个数组引用(用作字符串,它看起来像 ARRAY(0x.....);它不包含任何 #,因此由 PPR::decomment 保留原样)

与其逐行读取源代码,不如将其作为单个字符串读取,将其存储在变量中,然后将其传递给PPR::decomment

use File::Slurp;

my $sFilename = "test.pl";
my $source_code = read_file($sFilename);
my $without_comments = PPR::decomment($source_code);

print $without_comments;

您可能仍希望在读取文件后删除\r。在这种情况下添加

$source_code =~ s/\r$//g;

阅读您的输入后。

我使用File::Slurp 一次读取整个文件。如果您想要其他方法来做到这一点,请查看问题What is the best way to slurp a file into a string in Perl?

如果您需要数组中的文件行,则可以拆分字符串:

my @lines = split /\n/, $without_comments;

如果您希望保留换行符 (\n),请使用:

my @lines = split /(?<=\n)/, $without_comments; 

【讨论】:

  • 问题可能不够清楚,但我想在数组$aRawFileData$aUncommentFileData 中提供数据(使用行终止符\n),这样我就可以遍历数组(就像目前所做的那样)。
  • @albert 确实不清楚:D 我已经编辑了我的答案来做到这一点(见最后)
  • 您不想逐行处理代码。您需要前面几行的上下文才能知道您在代码中的位置。 Perl 不是面向行的语言。
猜你喜欢
  • 2010-10-27
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多