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