LINUX.ORG.RU

Вопрос по PERL


0

0

Ламерский вопрос по перлу..
каким образом мне загнать строчку из файла пословно в список,
если @list =qw/"$line"/; не работает (в qw интерполяция не работает)
Заранее спасибо.

anonymous

#!/usr/bin/perl -w
use strict;
$_="aaa bbbb ccccc ddd eee";
print join "\n" => split;
print "\n";

если чтение из файла, то какннить так(создается хеш массивов, 
в котором ключом для каждой тсроки является её номер):

#!/usr/bin/perl -w
use strict;
open F, "<eeeee.ext" or die "cant open: $!";
my (%h);

@{$_{$.}}=split while <F>;
close F;

print join "\n" => @{$_{$_}},"\n== line $_ ==\n" foreach sort {$a<=>$b} keys %_

print "\n";

только правда оно будет память выжирать... лучше построчно

print join "\n" => @{[split]},"\n" while <F>;

vilfred ☆☆
()
Ответ на: комментарий от vilfred

Из за таких как ты perl и ругают за нечитабельность :)

chucha ★★★☆
()
Ответ на: комментарий от vilfred

chucha wrote:

> Из за таких как ты perl и ругают за нечитабельность :)

Присоединяюсь :) Представляю, как выглядит этот код для
начинающего, который не знает даже, как разбить строку
на слова :)

vilfred, не сочтите за наезд, просто работать не хочется,
так что...

> @{$_{$.}}=split while <F>;

$_{$.} = [split] while <F>;

Так будет значительно быстрее. и читабельнее, хотя
это уже дело вкуса.

Но главное не это. Довольно глупо использовать словарь,
если заведемо известно, что ключами будет являться непрерывное
множество чисел 1..N. Для этого у нас, кажется, есть более
подходящий тип?

my @lines = map [split], <F>;

или

my @lines; push @lines, [split] while <F>;

чтобы не держать в памяти файл целиком.

> print join "\n" => @{$_{$_}},"\n== line $_ ==\n" foreach sort {$a<=>$b} keys %_

превращается в:

print join "\n" => @{$lines[$_]}, "\n== line $_ ==\n" for 0 .. $#lines;

> print join "\n" => @{[split]},"\n" while <F>;

Это выше моего понимания. @{[split]} ???

print join "\n" => split, "\n" while <F>;

idle ★★★★★
()

Ну, вы, блин, даёте... :)

> каким образом мне загнать строчку из файла пословно в список

Это зависит от разделителя:

@chars = split //, $word
@fields= split /:/, $line
@words = split " ", $paragraph
@lines = split /^/, $buffer

Глава 29. Функции (стр. 858) "Программирование на Perl",
Третье издание O'REILLY (рус.) Ларри Уолл, Том Кристиансен и Джон Орвант

open PASSWD, '/etc/passwd/;
while (<PASSWD>) {
# Строки будут в $_
chomp; # Удаляем символ \n
# в оригинале: ($login, $passwd, $uid, $gid, $gcos, $home, $shell) = split /:/;
# По умолчанию, работает с $_
@fields = split /:/;
# Здесь делаем что-нибудь с полями
...
#
}

anonymous
()
Ответ на: комментарий от anonymous

> open PASSWD, '/etc/passwd/;

open PASSWD, '/etc/passwd/';

пардон :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.