附加到每行数组

时间:2011-07-25 11:33:34

标签: perl

我刚开始接触Perl,我遇到了一个练习,我真的无法在set框架中解决这个问题。基本上我被要求在数组中的每一行的开头附加一个'#'符号。但是,我只需要添加一行额外的代码并可能修改一个现有的行。这是代码:

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

任何帮助都会受到赞赏,

提前致谢

6 个答案:

答案 0 :(得分:5)

使用for循环:

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

我建议这样做,因为map会创建一个新数组,而这会修改现有数组。如果要使用map,请将数组复制回原始数组。

@lines = map { '#' . $_ } @lines; ## possibly slower since it creates a new array then copies it

答案 1 :(得分:3)

使用map命令:

print map { '#' . $_ } @lines;

答案 2 :(得分:1)

看起来你正在尝试来自this exercisethis tutorial。请不要这样做。你为什么要从教程开始学习编程语言,首先要说:

  

请注意:本教程是在1990年代早期的版本中编写的   Perl的4。虽然它现在已经过时了,但它确实已经过时了   许多人多年来的热门信息来源。它有   因此被留在网上作为历史档案的一部分   因特网。

使用learn.perl.org中列出的(现代)资源会好得多。

无论如何,问题是有缺陷的。您无需添加一行代码,只需修改现有代码即可。

print map { "# $_" } @lines;

答案 3 :(得分:0)

close INFO;
grep{ $_ = "#$_"; undef } @lines;

如果没有 undef ,grep会为返回组装一个匹配的数组,该数组将被丢弃。由于 undef grep现在将丢弃所有内容。为什么这样做你需要自己挖掘。

额外信用:对不同的解决方案进行基准测试,以找到最快的。参见Benchmark模块

答案 4 :(得分:0)

这是perl,所以可能有很多方法可以做到,这里有一个:

print "#" . join('#', @lines);

答案 5 :(得分:-1)

通过添加前两行,您可以实现这一目标。

$file = "inputfile";
`sed 's/^/#/g' /etc/passwd > inputfile`;
open(INFO, $file);
@lines = <INFO>;
close(INFO);
print @lines;