Присоединение к каждой строке массива - PullRequest
0 голосов
/ 25 июля 2011

Я только начинаю изучать Perl, и я наткнулся на упражнение, которое я действительно не могу выполнить в рамках набора. В основном меня попросили добавить символ «#» в начало каждой строки в массиве. Но это мне нужно только добавить в 1 дополнительную строку кода и, возможно, изменить одну существующую строку. Вот код:

$file = '/etc/passwd';          
open(INFO, $file);              
@lines = <INFO>;                
close(INFO);                    
print @lines;

Любая помощь будет с благодарностью,

Заранее спасибо

Ответы [ 6 ]

5 голосов
/ 25 июля 2011

Используйте цикл for:

$_ = '#' . $_ for @lines;

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

@lines = map { '#' . $_ } @lines; ## possibly slower since it creates a new array then copies it
3 голосов
/ 25 июля 2011

используйте команду map:

print map { '#' . $_ } @lines;
1 голос
/ 25 июля 2011

Похоже, вы пытаетесь это упражнение , которое взято из этого урока .Пожалуйста, не делай этого.Почему вы хотите выучить язык программирования из учебника, который начинается со слов:

Обратите внимание: это руководство было написано в начале 1990-х годов для версии 4 Perl.Хотя сейчас он значительно устарел, он был популярным источником информации для многих людей на протяжении многих лет.Поэтому он был оставлен онлайн как часть исторического архива в Интернете.

Было бы намного лучше, если бы вы использовали (современные) ресурсы, перечисленные на learn.perl.org..

Вопрос в любом случае некорректен.Вам не нужно добавлять строку кода, вам просто нужно изменить существующую.

print map { "# $_" } @lines;
0 голосов
/ 25 июля 2011

Добавив первые две строки, вы можете достичь этого.

$file = "inputfile";
`sed 's/^/#/g' /etc/passwd > inputfile`;
open(INFO, $file);
@lines = <INFO>;
close(INFO);
print @lines;
0 голосов
/ 25 июля 2011

Это perl, так что, вероятно, есть десятки способов сделать это, вот один:

print "#" . join('#', @lines);
0 голосов
/ 25 июля 2011
close INFO;
grep{ $_ = "#$_"; undef } @lines;

Без undef grep соберет соответствующий массив для возврата, который отбрасывается.Поскольку undef grep теперь будет отбрасывать все.Почему это работает, вам нужно выяснить самостоятельно.

Дополнительный кредит: оцените различные решения, чтобы найти самое быстрое.Смотрите модуль Benchmark

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