Loading ...
Sorry, an error occurred while loading the content.

Issue with references and array slice with one member !

Expand Messages
  • Amit Saxena
    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
    Message 1 of 1 , Oct 31, 2008
    • 0 Attachment
      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


      [Non-text portions of this message have been removed]
    Your message has been successfully submitted and would be delivered to recipients shortly.