in reply to Re: Updating 1 array affects the other array
in thread Updating 1 array affects the other array

Hi, thanks for the explanation. I understand your explanation, but I've checked thru my codes but ca'nt see such mistake being committed. The only (write) operations I've done to the arrays (prior to discovering the problem) is shown below. What I am trying to do is to remove duplicate entries (based on certain column combinations) and store them in a new array (those with the "unique" prefix). The "cross-referencing" seems to have been committed here.
my %seen_values; my @unique_terminal_id = grep { !($seen_values{$_->[4]}++) } @temp_ope +n_single; my %seen_values; my @unique_manufacturer_model = grep { !($seen_values{$_->[9]}{$_->[10 +]}++) } @unique_terminal_id; my %seen_values; my @unique_manufacturer_model_version = grep { !($seen_values{$_->[9]} +{$_->[10]}{$_->[11]}++) } @unique_terminal_id;

Replies are listed 'Best First'.
Re^3: Updating 1 array affects the other array
by JadeNB (Chaplain) on Sep 02, 2008 at 14:29 UTC
    As other people have mentioned, what you're copying are references (as indicated by the de-referencing arrows that you're using in the greps). Namely, your array @temp_open_single is, presumably, an array of arrayrefs.

    Let's say that the first arrayref is pointing to the array at 0x18045c0, and that that array passes the test in the grep for @unique_terminal_id. Then @unique_terminal_id also contains a reference to the array at 0x18045c0. Let's suppose further that that array also passes the test in the grep for @unique_manufacturer_model. Then @unique_manufacturer_model also contains a reference to the—exact same!—array at 0x18045c0. It is copying the reference, not the referent.

    That means that, when you refer to $unique_terminal_id[0][0] or to $unique_manufacturer_model[0][0], in either case you're just looking at the entry at index 0 of the single array at 0x18045c0. After you change that single array in one place, the changes will still be visible even if you look at it from another location. As others have mentioned, you need something like Storable's dclone function (which makes a 'deep clone') will allow you to avoid this difficulty.