Как добавить автоматический инкремент числа к массиву? - PullRequest
1 голос
/ 07 сентября 2011

Я читаю содержимое файла в perl, используя следующий код

my @files = glob("$PATH/*");
foreach my $file (@files){
    open(MYFILE,"<$file");
    my @fileContent = <MYFILE>;
    close(MYFILE);
}

Теперь я хочу добавить к каждой строке автоматически увеличивающееся число.Что-то вроде -

fileContent[0] = 1: This
fileContent[1] = 2: is
fileContent[2] = 3: a
fileContent[3] = 4: text
fileContent[4] = 5: file.

Кто-нибудь знает эффективный способ сделать это?

Спасибо!

Ответы [ 5 ]

10 голосов
/ 07 сентября 2011

Как насчет однострочника?

perl -wne 'print "$.: $_"; close ARGV if eof;' path/*

Или внутри скрипта с массивом:

use strict;
use warnings;
use autodie;

while (<tmp/data*>) {
    open my $fh, '<', $_;
    my @fileContent;
    push @fileContent, "$.: $_" while <$fh>;
}

Документация по $. здесь.

0 голосов
/ 07 сентября 2011

Измените ваш открытый на:

open MYFILE, '-|', 'grep', '-n', '', $file
0 голосов
/ 07 сентября 2011

Вот ваш код, отредактированный для использования лексических переменных, 3 arg open и оператор map для добавления номеров строк.

my @files = glob("$PATH/*");
foreach my $file (@files){
    open my $fh,'<', $file or die $!;
    my $i = 1;
    my @fileContent = map {$i++.": $_"} <$fh>;

    # do something with @fileContent
}

Вот пример, который немного более изощренный (используя большеиз автоматических функций):

for (<$PATH/*>) {
    local @ARGV = $_;
    my $i = 1;
    my @lines = map {$i++.": $_"} <>;

    # do something with @lines
}

И вот пример, который использует $. (номер строки ввода) и цикл while для чтения файла строка за строкой.

for (<$PATH/*>) {
    local (@ARGV, $_) = $_;
    my @lines;
    push @lines, "$.: $_" while <>;

    # do something with @lines
}
0 голосов
/ 07 сентября 2011

Эффективное?Я не знаю, что на самом деле существует неэффективный способ сделать это (если вы не сделаете его неэффективным преднамеренно).

for my $lineNumber (1..@fileContent) {
    substr( $fileContent[$lineNumber-1], 0, 0, "$lineNumber: " );
}
0 голосов
/ 07 сентября 2011

Попробуйте это для своей строки назначения:

my $i;
my @fileContent = map{++$i.":  $_"} (<MYFILE>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...