Убрать весь комментарий из файла perl, используя perl / PPR - PullRequest
1 голос
/ 18 апреля 2020

У меня есть файл со следующим содержимым:

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" все еще содержит комментарии.

Как с этим справиться?

(Проблема с примечанием может показаться немного глупым, но я не perl программист, просто пытаюсь изменить какой-то существующий код)

Редактировать: небольшое пояснение, как я написал в комментарии к ответу от @Dada (и это также был добавлен в ответ):

Возможно, недостаточно ясен в вопросе, но я хотел бы, чтобы данные были доступны в массиве $aRawFileData и $aUncommentFileData (со строкой терминаторы \n), поэтому я могу перебирать массивы (как это делается в данный момент).

Ответы [ 2 ]

3 голосов
/ 18 апреля 2020

PPR::decomment принимает строку в качестве аргумента, см. Документацию:

Требуется один аргумент: строка, содержащая код курса

Здесь вы вызываете его на $aRawFileData, который является arrayref (используется как строка, выглядит как ARRAY(0x.....); она не содержит # и, таким образом, остается как * на 1013 *)

Вместо того, чтобы читать ваш исходный код построчно, вы должны прочитать его как одну строку, сохранить его в переменной и передать в 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, чтобы прочитать весь файл сразу. Если вам нужен другой способ сделать это, взгляните на вопрос Как лучше всего поместить файл в строку в Perl? .

Если вам нужно строки вашего файла в массиве, вы можете затем разбить вашу строку:

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

Если вы хотите сохранить переносы (\n), используйте:

my @lines = split /(?<=\n)/, $without_comments; 
0 голосов
/ 19 апреля 2020
#!/usr/bin/perl
#
# vim: ai:ts=4:sw=4
#

use strict;
use warnings;
use feature 'say';

my @aRawFileData = <DATA>;
my @aUncommentFileData = @aRawFileData;

s/#[^;]*\n/\n/ for @aUncommentFileData;

say '
Read:
----------------------';
print for @aRawFileData;

say '
Uncomment:
-----------------------';
print for @aUncommentFileData;

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

# line from begin
print "\n################################\n";
return $function && $function !~ /^[\s{#]/;
}

Выход

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

# line from begin
print "\n################################\n";
return $function && $function !~ /^[\s{#]/;
}

Uncomment:
-----------------------
sub is_top_level0 { 
print '\nFollowed by comment \n'; 


print "\n################################\n";
return $function && $function !~ /^[\s{#]/;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...