Hello all, Recently I faced one scenario with references and array slice in perl.
I used following program to retrieve the rows from a table in Oracle using Perl DBI. As shown in the program, I did following steps to retrieve the rows :- - used "fetchall_arrayref" to get the array reference to the complete table - dereferenced the reference "fetchall_arrayref" and iterate one by one over each row "$row" in a foreach loop - further deferenced "$row" to get the columns one by one Now here is the problem, I used "${$row}[0]", "${$row}[1]" etc one by one to get all the columns for a particular code. On one of the production code which I am working, they have used "@{$row}[0]" , "@{$row}[0]" instead of earlier. The results for both of them were same. When I did a through debugging on this, I found that "@{$row}[0]" or "@{$row}[1]" etc is taken as array slice by perl with only one member so it returns the value of the column in scalar and not in list context. With "${$row}[0]" or "${$row}[1]" etc, the column value is returned in scaler context. I want to know whether it's appropriate to use "@{$row}[0]" , "@{$row}[1]" instead of "${$row}[0]", "${$row}[1]" though both of them gives same result ? # cat o1.pl #!/usr/bin/perl ##!/u01/app/oracle/product/10.1.0/db_1/perl/bin/perl # Example PERL DBI/DBD Oracle Example on Oracle 10g use strict; use warnings; use DBI; my $dbname = "*****"; ## DB Name from tnsnames.ora my $user = "*****"; my $passwd = "*****"; #### Connect to the database and return a database handle my $dbh = DBI->connect("dbi:Oracle:${dbname}", $user, $passwd); if($dbh){ print("Connected as user $user\n"); } else { print("Failed to connect!\n"); exit; } #### Prepare and Execute a SQL Statement Handle my $sth = $dbh->prepare("SELECT owner,table_name,num_rows FROM all_tables"); # my $sth = $dbh->prepare("SELECT * FROM all_tables"); $sth->execute(); my $allTablesRow = $sth->fetchall_arrayref(); foreach my $row (@{$allTablesRow}) { if (defined ${$row}[0]) { print "<${$row}[0]>"; } else { print "<NULL>"; } if (defined ${$row}[1]) { print "<${$row}[1]>"; } else { print "<NULL>"; } if (defined ${$row}[2]) { print "<${$row}[2]>"; } else { print "<NULL>"; } print "\n"; } #### Disconnect #$dbh->disconnect; You have mail in /var/spool/mail/root # Thanks & Regards, Amit Saxena