我刚开始接触Perl,我遇到了一个练习,我真的无法在set框架中解决这个问题。基本上我被要求在数组中的每一行的开头附加一个'#'符号。但是,我只需要添加一行额外的代码并可能修改一个现有的行。这是代码:
$file = '/etc/passwd';
open(INFO, $file);
@lines = <INFO>;
close(INFO);
print @lines;
任何帮助都会受到赞赏,
提前致谢
答案 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 exercise的this 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;