comparing two arrays in perl

Discussion in 'Perl Misc' started by bcdixit, Aug 27, 2007.

  1. bcdixit

    bcdixit Guest

    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
    bcdixit, Aug 27, 2007
    #1
    1. Advertising

  2. 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
    Peter Makholm, Aug 27, 2007
    #2
    1. Advertising

  3. bcdixit

    Paul Lalli Guest

    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
    Paul Lalli, Aug 27, 2007
    #3
  4. 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
    Jürgen Exner, Aug 27, 2007
    #4
  5. bcdixit

    Paul Lalli Guest

    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
    Paul Lalli, Aug 27, 2007
    #5
  6. bcdixit

    jkstill Guest

    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
    jkstill, Aug 28, 2007
    #6
  7. bcdixit

    jkstill Guest

    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.
    jkstill, Aug 28, 2007
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. darrel
    Replies:
    2
    Views:
    5,050
    darrel
    Dec 23, 2005
  2. Nag
    Replies:
    3
    Views:
    523
  3. Miss Michelle. Heigardt

    Help comparing two arrays

    Miss Michelle. Heigardt, Jul 30, 2005, in forum: Java
    Replies:
    2
    Views:
    7,711
    Patricia Shanahan
    Jul 30, 2005
  4. learner9
    Replies:
    5
    Views:
    362
    Chris Uppal
    Apr 30, 2006
  5. Kev Jackson
    Replies:
    2
    Views:
    100
Loading...

Share This Page