comparing two arrays in perl
comparing two arrays in perl
am 27.08.2007 20:17:23 von bhooshan.dixit
Hi,
I have two arrays, for example,
@array = ("john","larry","kevin","peter","mike")
@exclude = ("john","kevin")
i want to delete from @array , values that exist in @exclude.
i.e. i want my @array to look like
@array("","larry","","peter","mike")
i have written this code but it doesnot seem to work.
foreach$i(0..$#exclude)
{
foreach$x(0..$#array)
{
if($array[$x] eq $exclude[$i])
{
delete($array[$x]);
next;
}
}
}
am I missing something? is there someother better way to do it in
perl?
thanks
-bd
Re: comparing two arrays in perl
am 27.08.2007 20:24:35 von Peter Makholm
bcdixit writes:
> @array = ("john","larry","kevin","peter","mike")
> @exclude = ("john","kevin")
>
> i want to delete from @array , values that exist in @exclude.
> i.e. i want my @array to look like
What you need is an easy way to check if an value is in @exclude. This
can be done by converting it to a hash where easch element from
@exclude is an key with an true value:
This can be done this way
%exclude = map { $_ => 1 } @exclude;
or this way:
$exclude{$_} = 1 for @exclude;
(and probbaly many other ways).
Then you just need to iterate over @array one time.
//Makholm
Re: comparing two arrays in perl
am 27.08.2007 20:41:08 von Paul Lalli
On Aug 27, 2:17 pm, bcdixit wrote:
> I have two arrays, for example,
>
> @array = ("john","larry","kevin","peter","mike")
> @exclude = ("john","kevin")
>
> i want to delete from @array , values that exist in @exclude.
Your Question (or at least a variant of it) is Frequently Asked...
$ perldoc -q "difference of two arrays"
Found in /opt/perl/lib/5.6.1/pod/perlfaq4.pod
How do I compute the difference of two arrays? How do I
compute the intersection of two arrays?
> i.e. i want my @array to look like
>
> @array("","larry","","peter","mike")
>
> i have written this code but it doesnot seem to work.
Does not work is the worst possible error description. *HOW* does it
not work? What results does it produce that you did not expect?
>
> foreach$i(0..$#exclude)
> {
> foreach$x(0..$#array)
> {
> if($array[$x] eq $exclude[$i])
> {
> delete($array[$x]);
delete(), when used on array elements, will undefine internal
elements, and will remove the last element. This is generally not a
good thing, and also doesn't match your desired output. I think you
instead want:
$array[$x] = "";
> next;
"next" being the last statement in a block is a no-op. It simply says
to go up to the beginning of the current loop and start the next
iteration. That's what would happen anyway. I think you meant "last"
here.
> }
> }
> }
>
> am I missing something?
You tell me. The code (after being modified as I suggest) does
exactly what you say you want. If you disagree, post a short-but-
complete script with desired output and actual output.
> is there someother better way to do it in perl?
Yes, use hashes, as Peter and the FAQ both suggested.
Paul Lalli
Re: comparing two arrays in perl
am 27.08.2007 20:55:48 von jurgenex
bcdixit wrote:
> I have two arrays, for example,
>
> @array = ("john","larry","kevin","peter","mike")
> @exclude = ("john","kevin")
>
> i want to delete from @array , values that exist in @exclude.
> i.e. i want my @array to look like
>
> @array("","larry","","peter","mike")
>
> i have written this code but it doesnot seem to work.
>
> foreach$i(0..$#exclude) {
> foreach$x(0..$#array) {
> if($array[$x] eq $exclude[$i]){
> delete($array[$x]);
[...]
> am I missing something?
Yes. It is very bad to change the array (add or remove elements) while
looping through it using foreach().
> is there someother better way to do it in perl?
Like explained in the FAQ: "How do I compute the difference of two arrays?
How do I compute the intersection of two arrays?"
jue
Re: comparing two arrays in perl
am 27.08.2007 21:26:13 von Paul Lalli
On Aug 27, 2:55 pm, "Jürgen Exner" wrote:
> bcdixit wrote:
> > foreach$i(0..$#exclude) {
> > foreach$x(0..$#array) {
> > if($array[$x] eq $exclude[$i]){
> > delete($array[$x]);
> [...]
> > am I missing something?
>
> Yes. It is very bad to change the array (add or remove elements)\
> while looping through it using foreach().
The only element that could be deleted from that array is the last
one. I don't see how that could affect anything, as it would also
therefore be the last iteration of the loop.
Paul Lalli
Re: comparing two arrays in perl
am 28.08.2007 20:34:23 von jkstill
On Aug 27, 11:17 am, bcdixit wrote:
> Hi,
> I have two arrays, for example,
>
> @array = ("john","larry","kevin","peter","mike")
> @exclude = ("john","kevin")
>
> i want to delete from @array , values that exist in @exclude.
> i.e. i want my @array to look like
>
> @array("","larry","","peter","mike")
>
> i have written this code but it doesnot seem to work.
>
> foreach$i(0..$#exclude)
> {
> foreach$x(0..$#array)
> {
> if($array[$x] eq $exclude[$i])
> {
> delete($array[$x]);
> next;
> }
> }
> }
>
> am I missing something? is there someother better way to do it in
> perl?
>
> thanks
> -bd
This looks promising:
http://www.perlmonks.org/index.pl?node=429761
Re: comparing two arrays in perl
am 28.08.2007 21:12:14 von jkstill
On Aug 28, 11:34 am, jkstill wrote:
> On Aug 27, 11:17 am, bcdixit wrote:
>
>
>
> > Hi,
> > I have two arrays, for example,
>
> > @array = ("john","larry","kevin","peter","mike")
> > @exclude = ("john","kevin")
>
> > i want to delete from @array , values that exist in @exclude.
> > i.e. i want my @array to look like
>
> > @array("","larry","","peter","mike")
>
> > i have written this code but it doesnot seem to work.
>
> > foreach$i(0..$#exclude)
> > {
> > foreach$x(0..$#array)
> > {
> > if($array[$x] eq $exclude[$i])
> > {
> > delete($array[$x]);
> > next;
> > }
> > }
> > }
>
> > am I missing something? is there someother better way to do it in
> > perl?
>
> > thanks
> > -bd
>
> This looks promising:
>
> http://www.perlmonks.org/index.pl?node=429761
My bad, replied to the wrong thread.