Как я могу разобрать многострочные записи в Perl? - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь разобрать строку, использующую разделитель '#', в этой строке 3 строки

101#Introduction to the Professor#SG_FEEL#QUE_NOIMAGE#
head up to the Great Hall and speak to the professor to check in for class.#
#

102#Looking for Instructors#SG_FEEL#QUE_NOIMAGE#
Look for the Battle Instructor.#
Talk to Battle Instructor#

103#Battle Instructor#SG_FEEL#QUE_NOIMAGE#
You have spoken to the Battle Instructor#
#

как получить каждое значение перед разделителем '#', чтобы я мог создать новый формат, который будет выглядетькак это

[101] = {
    Title = "Introduction to the Professor",
    Description = {
        "head up to the Great Hall and speak to the professor to check in for class."
    },
    Summary = ""
},  
[102] = {
    Title = "Looking for Instructors",
    Description = {
        "Look for the Battle Instructor."
    },
    Summary = "Talk to Battle Instructor"
},
[103] = {
    Title = "Battle Instructor",
    Description = {
        "You have spoken to the Battle Instructor"
    },
    Summary = ""
},

Также будет несколько данных из 101 - n

Я пытаюсь использовать split с кодом ниже:

#!/usr/bin/perl

use strict;
use warnings;

my $data = '101#Introduction to the Professor#SG_FEEL#QUE_NOIMAGE#';

my @values = split('#', $data);

foreach my $val (@values) {
    print "$val\n";
}

exit 0;

ивывод:

101
Introduction to the Professor
SG_FEEL
QUE_NOIMAGE

Как читать многострочные данные?А также, как исключить некоторые данные, например, чтобы соответствовать новому формату, мне не нужны данные SG_FEEL и QUE_NOIMAGE

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Специальная переменная Perl $/ устанавливает «разделитель входных записей» - строку, которую Perl использует для определения конца строки.Вы можете установить это на что-то другое.

use v5.26;
use utf8;
use strict;
use warnings;

$/ = "\n\n";  # set the input record separator

while( <DATA> ) {
    chomp;
    say "$. ------\n", $_;
    }

__END__
101#Introduction to the Professor#SG_FEEL#QUE_NOIMAGE#
head up to the Great Hall and speak to the professor to check in for class.#
#

102#Looking for Instructors#SG_FEEL#QUE_NOIMAGE#
Look for the Battle Instructor.#
Talk to Battle Instructor#

103#Battle Instructor#SG_FEEL#QUE_NOIMAGE#
You have spoken to the Battle Instructor#
#

Выходные данные показывают, что вы читаете целые записи с каждым вызовом <DATA>:

1 ------
101#Introduction to the Professor#SG_FEEL#QUE_NOIMAGE#
head up to the Great Hall and speak to the professor to check in for class.#
#
2 ------
102#Looking for Instructors#SG_FEEL#QUE_NOIMAGE#
Look for the Battle Instructor.#
Talk to Battle Instructor#
3 ------
103#Battle Instructor#SG_FEEL#QUE_NOIMAGE#
You have spoken to the Battle Instructor#
#

Оттуда вы можете анализировать эту запись так, как вам нужно.

0 голосов
/ 03 октября 2018

Легко читать несколько строк, см. readline :

open my $fh, '<', $filename
    or die "Couldn't read '$filename': $!";
my @input = <$fh>;

Теперь вы хотите просмотреть все строки и посмотреть, что с ними делать:

my $linenumber;
my %info; # We want to collect information
while ($linenumber < $#input) {

Каждая строка, которая начинается с nnn#, начинает новый элемент:

    if( $input[ $linenumber ] =~ /^(\d+)#/ ) {
        my @data = split /#/, $input[ $linenumber ];
        $info{ number } = $data[0];
        $info{ Title } = $data[1];
        $linenumber++;
    };

Теперь читайте материал в описании, пока не встретится пустая строка:

    while ($input[$linenumber] !~ /^#$/) {
        $info{ Description } .= $input[$linenumber];
        $linenumber++;
    };

    $linenumber++; # skip the last "#" line

Теперь,выведите материал в %info, отформатировав его как упражнение.Я использовал qq{} в демонстрационных целях.Вы можете изменить это на qq():

    print qq{Number: "$info{ number }"\n};
    print qq{Title: "$info{ Title }"\n};
    print qq(Description: {"$info{ Description }"}\n);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...