nashkab has asked for the wisdom of the Perl Monks concerning the following question:

Monks, I have two arrays @union and @ICUNAV.

@union = ((SDT,`1781183799.44927\',-----), (BN,`1781183799.44972\',-----), (BNN,`1781183799.46753\',-----)); @ICUNAV = ((BN,`1781183799.44972\',-----), (BNN,`1781183799.46753\',-----),(SFG,`1781183799.46753\',-----));

I am trying to find the new elements in @ICUNAV which dows not exist in @union. The result i am getting is:

@diff = ((SDT,`1781183799.44927\',-----), (SFG,`1781183799.46753\',-----));

What I want is

@diff = (SFG,`1781183799.46753\',-----);

my @diff; my @inter; my %count2 = (); foreach my $element (@union,@ICUNAV) { $count2{$element}++; }; foreach my $element (keys %count2) { push @{ $count2{$element} > 1 ? \@inter : \@diff }, $element; }; print Dumper(@diff),"\n";

I am new in Perl.Your help will be appreciated

Replies are listed 'Best First'.
Re: Array Difference for Two Dimentional Array!
by NetWallah (Canon) on Jan 07, 2008 at 01:05 UTC
    Your use of SQUARE BRACKETS causes the arrays to contain a single element.

    That element is a reference to an array.

    Since you are beginner, it would seem that this structure is not intentional.

    Also, you have not posted what code you are running to compare the arrays and extract unique elements. By the way, the algorithm to do this is covered in the perl documentation FAQ.

    It is difficult to suggest a course of action other than to gently request you to please RTFM,and read How (Not) To Ask A Question.

    Update: The OP has modified the node, and replaced square brackets with parens, and added code, since this response was posted.

         "As you get older three things happen. The first is your memory goes, and I can't remember the other two... " - Sir Norman Wisdom

      Hi Netwallah,

      Thanks for your responce. I used the code:

      my @diff; my @inter my %count2 = (); foreach my $element (@union,@ICUNAV) { $count2{$element}++; }; foreach my $element (keys %count2) { push @{ $count2{$element} > 1 ? \@inter : \@diff }, $element; }; print Dumper(@diff),"\n";

      I have very little knowledge on perl. I have seen some examples on 1 dimensional array..however not on two dimensional array. Your knowledge will really help me here. Thanks in advance.

        To be pedantic, Perl doesn't have multi-dimensional arrays; it has one-dimensional arrays which have elements which may be references to arrays. In practice, this means that the elements have to be dereferenced, either explicitly, meaning that your code does it, or implicitly, meaning the dereferencing is hidden in a module. In more C-ish terms, Perl emulates two-dimensional arrays by using arrays of pointers to arrays. This can be repeated, recursively, to any arbitrary level, so a Perl array, @array could have elements which are references to arrays, which can, in turn, have elements which are references to other arrays.

        As an aside, your request appears similar to this one, which could be interpreted as your being less than diligent in your research.


        emc

        Information about American English usage here and here.

        Any Northeastern US area jobs? I'm currently unemployed.

        At Perlmonks, it is considered bad form to modify the contents of your post, without posting a message.

        If you need to correct something, leave the original text (or use strikethrough), then add your update below, after first clearly indicating that it is an update.

        This allows others to follow the thread of responses to your original text.

        Your updated code reads:

        @union = ((SDT,`1781183799.44927\',-----),
        This is NOT a 2-dimensional array (or Array-of-Arrays (AOA)). The proper syntax for an AOA is:
        @union = (['SDT','1781183799.44927\','-----'], ['BN','1781183799.44972\','-----'], ['BNN','1781183799.46753\','-----']);
        I replaced your backticks with single quotes, and added other quotes to make it legal for perl.

        Now, to get your @diff for this type of AOA, use this code instead of yours (UNTESTED) :

        my @diff; my @inter my %count2 = (); foreach my $element (@union,@ICUNAV) { my $k=join '',@$element; $count2{$k}{COUNT}++; $count2{$k}{ELEMENT}=$element; }; foreach my $element (keys %count2) { push @{ $count2{$element}{COUNT} > 1 ? \@inter : \@diff }, $count2{$ +element}{ELEMENT}; }; print Dumper(@diff),"\n";

             "As you get older three things happen. The first is your memory goes, and I can't remember the other two... " - Sir Norman Wisdom

Re: Array Difference for Two Dimentional Array!
by ysth (Canon) on Jan 07, 2008 at 01:53 UTC
    You are trying to show us your arrays with pseudo-perl starting @array = ..., but the rest is not valid perl, and it's not clear where elements start or end, or even if this is a one dimensional array or not.

    How about showing the contents of the arrays using Data::Dumper's Dumper(\@array) output instead?

    Rereading the question, I think I understand. The comparison code you are using is designed to detect differences in either array. To just find the ones unique to @ICUNAV, you would use just @union in your first loop, and then loop through @ICUNAV looking for elements for which no key exists in the hash.