Perl Массивы и grep - PullRequest
       9

Perl Массивы и grep

1 голос
/ 03 сентября 2010

Я думаю, это более характерно, во всяком случае, у меня есть текстовый файл, состоящий из чего-то вроде:

COMPANY NAME

    City

    Addresss,
     Address number

    Email 

    phone number

и так далее ... (повторяется, но с другими данными ...), давайте предположим, что текст теперь находится в переменной $ strting.

Я хочу иметь массив (@row), например:

$row[0] = "COMPANY NAME";
$row[1] = "City";
$row[2] = "Addresss,
              Address number";
$row[3] = "Email";
$row[4] = "phone number";

Сначала я подумал, что это легко сделать с помощью grep, что-то вроде этого: 1) @rwo = grep (/^^$/, $string); Нет GO! 2) @row = grep (/\n/, $string);

до сих пор не пошел, пробовал также с split и тому подобное, все еще не пошел. любая идея? спасибо,

Ответы [ 4 ]

6 голосов
/ 03 сентября 2010

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

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

local $/ = '';

my @row = <DATA>;

chomp @row;

print Dumper(\@row);

__DATA__
COMPANY NAME

City

Addresss,
 Address number

Email 

phone number

Вывод:

$ ./addr 
$VAR1 = [
          'COMPANY NAME',
          'City',
          'Addresss,
 Address number',
          'Email ',
          'phone number'
        ];
5 голосов
/ 03 сентября 2010

Насколько я понимаю ваш вопрос, вы хотите захватить предметы, разделенные хотя бы одной пустой строкой.Хотя /\n{2,}/ будет правильным в буквальном смысле (разделенным на одну или несколько строк новой строки), я бы предложил следующее регулярное выражение, потому что оно будет обрабатывать почти пустые строки (те, которые содержат только пробельные символы).

use strict;
use warnings;

my $str = 'COMPANY NAME

City

Addresss,
 Address number

Email 

phone number';

my @items = split /\n\s*\n/, $str;
1 голос
/ 03 сентября 2010
use strict;
 use warnings;
 my $string = "COMPANY NAME

        City

        Addresss,
         Address number

        Email

        phone number";

    my @string_parts = split /\n\n+/, $string; 
    foreach my $test (@string_parts){
          print"$test\n";
    }

ВЫХОД:

COMPANY NAME
City
Addresss,
Address number 
Email
phone number
0 голосов
/ 03 сентября 2010

grep не может принимать строку в качестве аргумента.

Вот почему вам нужно split строка на токене, который вы ищете (как FM показывает ).

Поканеясно, для чего это нужно, я настоятельно рекомендую рассмотреть модуль Tie::File:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...