Как я могу избежать этой ошибки при использовании «строгого»? - PullRequest
5 голосов
/ 11 апреля 2011

У меня есть пара строк кода, которые работают, если use strict; закомментирован.Однако я не хочу отключать его для всего скрипта только из-за одного небольшого раздела.

Мне нужно либо перекодировать его, либо временно отключить use strict;, а затем снова включить.Первый вариант более реалистичен, но я не знаю, как изменить код для работы в строгом режиме.

my ($ctc_rec_ref) = get_expected_contacts($ctc,$fy);

my @expected_ctc_rec = @$ctc_rec_ref;

print $expected_ctc_rec[0][0]."\n";
print $expected_ctc_rec[0][1]."\n";
print $expected_ctc_rec[0][2]."\n";

sub get_expected_contacts
{
    my (@ctc_rec,$i) = ((),0);
    $STMT = "SELECT DISTINCT field1, field2, field3 FROM table WHERE field4 = ? AND field5 = ? AND field6 = 'E'";
    $sth = $db1->prepare($STMT); $sth->execute(@_); 
    while(@results = $sth->fetchrow_array())
    {
        push @{ $ctc_rec[$i] }, $results[0];
        push @{ $ctc_rec[$i] }, $results[1];
        push @{ $ctc_rec[$i] }, $results[2];

        $i++;
    }   
    return (\@ctc_rec);
}


При включенном use strict;:

Невозможно использовать строку ("0") в качестве ссылки ARRAY, в то время как используются "строгие ссылки" в строке ./return5.pl 49.

(строка 49: push @{ $ctc_rec[$i] }, $results[0];)


С отключенным use strict;:

1468778 
04/01/2011 
30557

Как переписать этот код, чтобы он работал так, как если бы строгий режим был отключен?Если это невозможно, можно ли временно отключить use strict;, а затем повторно включить этот короткий фрагмент кода в сценарии?

Ответы [ 2 ]

20 голосов
/ 11 апреля 2011

Проблема в том, что

my (@ctc_rec,$i) = ((),0);

не делает то, что вы думаете, что делает.Это означает то же самое, что

my @ctc_rec = (0);
my $i;

strict делает то, для чего предназначен, и ловит вашу ошибку.Попробуйте написать:

my @ctc_rec;
my $i = 0;

.Это должно избавить от ошибки.

В этом случае есть еще один способ избавиться от ошибки и одновременно значительно упростить ваш код: используйте selectall_arrayref .

sub get_expected_contacts
{
   return $db1->selectall_arrayref(
     "SELECT DISTINCT field1, field2, field3 FROM table WHERE field4 = ? AND field5 = ? AND field6 = 'E'",
     undef, @_
   );
}

Если вы действительно намеренно делали что-то, что было запрещено strict (но знали, что делали), вы можете отключить strict локально:

use strict;

# this code is strict
{ 
  no strict;
  # some code that is not strict here
}
# strict is back in effect now

Но вы никогда не должныделайте это до тех пор, пока не поймете, на что конкретно жалуется strict и почему в этом случае это нормально.Также лучше отключить только ту часть strict, которая вам нужна.Например, вы можете сказать no strict 'refs';, чтобы разрешить символьные ссылки без отключения других вещей, которые strict делает.(Примечание: та же техника работает с прагмой предупреждений , которую также следует использовать.)

10 голосов
/ 11 апреля 2011

Проблема с объявлением @ctc_rec и $ i. Попробуйте это, и ваш код должен перестать выдавать ошибку от строгого:

Заменить:

my (@ctc_rec,$i) = ((),0);

С:

my @ctc_rec;
my $i = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...