【问题标题】:Missing first row in array output数组输出中缺少第一行
【发布时间】:2017-06-01 09:21:43
【问题描述】:

当我尝试遍历 SQL 查询的某些结果时,我看不到第一个条目。以下是查询的不同输入的外部循环。一些版本返回一行,其他版本最多返回十行,但第一行总是丢失。以“当前条目”开头的显示行总是从 2 开始。我知道 Perl 数组从零开始,但“foreach”不要求特定数字 - 只是为了显示每个数组元素。我在这里做错了什么吗?

谢谢。

  $OurSQL = "select DISTINCT BORROWER.BARCODE, POST_CODE, SURNAME, FIRST_NAMES, ";
  $OurSQL = $OurSQL."LOAN.CREATE_LOCATION FROM ADDRESS, CONTACT_POINT, BORROWER ";
  $OurSQL = $OurSQL."left join LOAN on (BORROWER.BORROWER_ID = LOAN.BORROWER_ID) ";
  $OurSQL = $OurSQL."where (BORROWER.BORROWER_ID = CONTACT_POINT.BORROWER_ID) and ";
  $OurSQL = $OurSQL."(CONTACT_POINT.ADDRESS_ID = ADDRESS.ADDRESS_ID) and ";
  $OurSQL = $OurSQL."(upper(BORROWER.SURNAME) = upper('".$sname."') and upper(BORROWER.FIRST_NAMES) = upper('".$fname."')) and ";
  $OurSQL = $OurSQL."(ADDRESS.POST_CODE = '".$postcode."') AND (LOAN.CREATE_DATE >";
  $OurSQL = $OurSQL."dateadd(year, -1, getdate())) ORDER BY POST_CODE, SURNAME, FIRST_NAMES, CREATE_LOCATION";

$lib = 0;
  (@our_usage) = &sql($d, $OurSQL);
  # Iterate through array returned for the current borrower
  foreach $entry (@our_usage)
  {
    # Put current line into our variables
    $lib++;
    print "Current entry ($lib): $entry\n";
    ($ourbcode, $ourpcode, $oursname, $ourfnames, $ourloc) = split('~', $entry);
    $ourline = "$ourbcode $ourpcode $oursname $ourfnames $ourloc";
    # Show each line on screen
    print $ourline."\n";
    print OUT $ourline."\n";
  } # End of results loop

【问题讨论】:

  • $lib++; 你先递增然后打印index 1 元素的值,而不是index 0element,将它移到print 语句之后。
  • 在第一行 print 之后放置一个 next;。这说明了什么?
  • @AbhiNickz:你是对的,但是 OP 说 “显示行开始“当前条目”总是从 2 开始”。您的评论没有解释这一点。
  • 有些事情你没有告诉我们。如果$lib 在第一次迭代中为2,从代码中我们看到它不能,也许&sql() 改变$lib
  • 因为你没有use strict 并且你没有在my 的词法范围内声明你的变量,@Jens 有一个很好的观点。如果您在sub sql { ... } 内有另一个变量$lib,那将是与您的这部分代码中的$lib 相同的变量,因为如果您不这样做,Perl 会将所有变量都变成包变量不要用my 声明它们。因此,您将从不同的代码中更改相同的内容。这就是为什么你应该总是在你的代码中包含use strict,它会告诉你。还包括use warnings,看看你还有什么做错了。

标签: arrays perl loops foreach


【解决方案1】:

没有足够的代码让我们看看到底出了什么问题。 这是一个完整的有效脚本,使用固定字符串而不是调用sql(),希望您可以将其转换为适合您的东西。

$ cat x.pl
#!/usr/bin/env perl

use warnings;
use diagnostics;
use strict;

# ...your other code here...

my @our_usage = ("a~b~c~d~e", "1~2~3~4~5", "R~S~T~U~V");
# Iterate through array returned for the current borrower
my $lib = 0;
foreach my $entry (@our_usage)
{
  # Put current line into our variables
  $lib++;
  print "Current entry ($lib): $entry\n";
  my ($ourbcode, $ourpcode, $oursname, $ourfnames, $ourloc) = split('~', $entry);
  my $ourline = "$ourbcode $ourpcode $oursname $ourfnames $ourloc";
  # Show each line on screen
  print $ourline."\n";
} # End of results loop

示例运行:

$ perl ./x.pl
Current entry (1): a~b~c~d~e
a b c d e
Current entry (2): 1~2~3~4~5
1 2 3 4 5
Current entry (3): R~S~T~U~V
R S T U V

【讨论】:

  • 非常感谢(来晚了!)。 (我无法使用 strict,因为我的服务(数据库)提供者给了我连接字符串(在库中)并且他们没有使用 strict,但我找到了解决问题的方法。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
相关资源
最近更新 更多