Arrays 是否有一种方法可以根据数组中的一个元素的值而不是元素编号替换为数组中的两个新元素?
我在用Perl编程,我的情况是,我有一个数组,比如Arrays 是否有一种方法可以根据数组中的一个元素的值而不是元素编号替换为数组中的两个新元素?,arrays,perl,Arrays,Perl,我在用Perl编程,我的情况是,我有一个数组,比如@contents=(a,S,D,F,m,E),我想用两个新元素X和Y,比如@contents将等于(a,S,D,F,X,Y,E),你可以使用 或者您可以使用: 如果您使用的是perl 5.12及更高版本,还可以通过使用作为索引列表来进一步简化 #/usr/bin/perl-wT 严格使用; my@contents=qw(A-S-D-F-M-E); 我的$match='M'; my@replace=qw(X Y); 我的$arrlen=@目录;
@contents=(a,S,D,F,m,E)
,我想用两个新元素X
和Y
,比如@contents
将等于(a,S,D,F,X,Y,E)
,你可以使用
或者您可以使用:
如果您使用的是perl 5.12及更高版本,还可以通过使用作为索引列表来进一步简化
#/usr/bin/perl-wT
严格使用;
my@contents=qw(A-S-D-F-M-E);
我的$match='M';
my@replace=qw(X Y);
我的$arrlen=@目录;
对于(我的$i=0;$i<$arrlen;$i++)
{
如果($contents[$i]eq$匹配)
{
拼接(@contents,$i,1,@replace);
最后;
}
}
为每个(@contents)打印“$\un”;
一些提示:使用警告
是推荐的术语,因为它允许词法范围。对循环使用perl风格,例如my$arrlen=$#contents;对于我的$i(0..$arrlen)..
而不是循环的C样式。你为什么要用污点检查?使用last
将仅替换匹配的第一次出现。你可能有兴趣调查一下say for@contents
更好看+感谢您同时使用strict和warning。谢谢您帮我查看我的代码。我的目的是让不熟悉perl的人更容易理解代码,因为我从perl新手那里听到的最常见的抱怨是语法模糊。波塔托,波塔托,我想。我正在使用last
打破循环,因为原始帖子中的示例代码没有表明它需要匹配多次(原始数组中只有1'M')。如果不是这样,那么是的,我建议删除last
语句。只有在您不知道的情况下,它才是模糊的。我发现我读很多人的perl比读他们的英语要好@TLP Perl有一个非常好的定义语法,而英语的定义却非常不好。您应该添加一个注释,即keys@contents
仅适用于5.12或更高版本的Perl。@BradGilbert如此添加。许多看似简单的便利功能都需要这些愚蠢的注释。这仅仅是因为它还是那么新。有一些我们认为理所当然的事情。就像,还有。@BradGilbert,不过这不像是beta版。5.12出局了,什么,2年,5.10出局了4年。必须有更好的方法来处理向后兼容性,以便人们实际上更新他们的Perl二进制文件。是否要替换所有出现的<代码> M <代码>,或者仅仅是第一个,或者你是否满足于假设只有一个?@伍迪,如果你考虑了你的问题,请考虑通过点击左边的复选标记来接受其中一个答案。
@contents = map { $_ eq 'M' ? ('X','Y') : $_ } @contents;
for (0 .. $#contents) {
if ($contents[$_] eq 'M') {
splice @contents, $_, 1, 'X', 'Y';
}
}
#!/usr/bin/perl -wT
use strict;
my @contents = qw(A S D F M E);
my $match = 'M';
my @replace = qw(X Y);
my $arrlen = @contents;
for (my $i = 0; $i < $arrlen; $i++)
{
if ($contents[$i] eq $match)
{
splice (@contents, $i, 1, @replace);
last;
}
}
print "$_\n" foreach (@contents);