Предупреждение Perl: "Найдено = в условном, должно быть ==", но в строке нет знака равенства - PullRequest
4 голосов
/ 01 ноября 2011

Выполнение следующего в Perl v5.12.3 на MacOS 10.7.2:

#!/usr/local/bin/perl

use strict;
use warnings;
use DBI;

my $db = DBI->connect("dbi:SQLite:testdrive.db") or die "Cannot connect: $DBI::errstr";

my @times = ("13:00","14:30","16:00","17:30","19:00","20:30","22:00");

my $counter = 1;

for (my $d = 1; $d < 12; $d++) {
    for (my $t = 0; $t < 7; $t++) {
        #weekend days have 7 slots, weekdays have only 4 (barring second friday)
        if (($d+4) % 7 < 2 || ($t > 3)) {
            $db->do("INSERT INTO tbl_timeslot VALUES ($counter, '$times[$t]', $d);");
            $counter++;
        #add 4:00 slot for second Friday
        } elsif (($d = 9) && ($t = 3)) {
            $db->do("INSERT INTO tbl_timeslot VALUES ($counter, '$times[$t]', $d);");
            $counter++;
        }
    }
}

$db->disconnect;

Я получаю предупреждение «Найдено = в условном, должно быть == в addtimes.pl строка 16», но естьнет знака равенства на этой линии.Кроме того, цикл, кажется, начинается в $d == 9.Чего мне не хватает?

Строка 16:

if (($d+4) % 7 < 2 || ($t > 3)) {

Спасибо.

Ответы [ 2 ]

18 голосов
/ 01 ноября 2011

Проблема в вашем elsif

} elsif (($d = 9) && ($t = 3)) {
             ^-----------^--------- should be ==

Поскольку оператор if начинался в строке 16, а elsif является частью этого оператора, отсюда и была получена ошибка.Это печальное ограничение компилятора Perl.

На неродной ноте гораздо приятнее избегать циклов в стиле C, когда вы можете:

for my $d ( 1 .. 11 ) { 
    ...
    for my $t ( 0 .. 6 ) { 
        ...
    }
}

Разве это не красивее?:)

6 голосов
/ 01 ноября 2011
} elsif (($d = 9) && ($t = 3)) {

Эта строка назначит 9 для $d и 3 для $t. Как говорится в предупреждении, вы, вероятно, хотите это вместо:

} elsif (($d == 9) && ($t == 3)) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...