Получение ошибки при использовании оператора деления (/) в perl cgi? - PullRequest
4 голосов
/ 11 марта 2012

Я использую следующую функцию для подсчета количества дней.Аргументом для функции setAge является epoc time.

 sub getAge {
    my $diff;
    my $age=0;
    my $sec=86400;
    my $createTime;
    my $currTime;
    $createTime = $_[0];
    $currTime = UnixDate("now", "%s");
    $diff = ($currTime - $createTime);
    $age =(($diff-($diff%$sec))/$sec);
    return $age;
 }

Но всякий раз, когда я использую оператор деления, я получаю следующее сообщение об ошибке

syntax error at /apollo/env/ShiftReport/server-root/gcShiftReport.cgi line 616, near ")
    {"
syntax error at /apollo/env/ShiftReport/server-root/gcShiftReport.cgi line 618, near "case 'OX-Gift-Hyderabad'"
Execution of /apollo/env/ShiftReport/server-root/gcShiftReport.cgi aborted due to compilation errors.

Строка ошибки исходит из непосредственно следующего определения функции.

sub getName {
    my $tempName = $_[0];
    switch ($tempName)
    {
            case 'Cart Software' { return 'CART' }
            case 'OX-Gift-Hyderabad' { return 'Gift' }
            else { return $_[0]}
    }
}

Может ли кто-нибудь дать некоторое указание на то, почему это происходит, и только когда я использую оператор деления (/).

Ответы [ 3 ]

3 голосов
/ 11 марта 2012

Как отмечается в комментариях, вы используете устаревший Switch модуль.Возможно, вы забыли добавить use Switch, поэтому ключевое слово switch не импортируется.Если вы хотите эту функцию, вы должны использовать use feature qw(switch) вместо этого, который использует ключевые слова given, when и default.

Ваше сообщение об ошибке, которое довольно расплывчато, приходит от perl notобработка switch ($variable) { ... } как правильное утверждение.Компилятор считает, что видит функцию из-за голого слова switch, за которым следует parens, но следующий блок { ... } вызывает ошибку.

Это не имеет ничего общего с кодом, предшествующим ему, икод работает для меня, если я добавлю use Switch

это спорно, если с помощью этой конкретной функции для этого кода является хорошим выбором

use feature qw(switch);

sub getName {
    my $tempName = $_[0];
    given ($tempName)
    {
            when ('Cart Software') { return 'CART' }
            when ('OX-Gift-Hyderabad') { return 'Gift' }
            default { return $_[0]}
    }
}

эквивалент, не полагаясь на коммутаторе..:

sub getName {
    my $name = shift;
    return "CART" if $name eq "Cart Software";
    return "Gift" if $name eq "OX-Gift-Hyderabad";
    return $name;
}

Я думаю, что это предпочтительнее, так как более понятно, какой тип сравнения выполняется.

ETA: Ваша подпрограмма getAge может быть написана намного эффективнее.Я взял на себя смелость удалить ваши случайные заглавные буквы, потому что они злые, и Perl на самом деле различает aFunctionForGettingStuff и aFunctionForgettingStuff.

Я вижу, что вы используете какой-то домашний способ обрезания числа,В этом нет необходимости, поскольку в Perl есть встроенная функция, которая делает это: int ()

sub getage {
    my $createtime = shift; # shift first argument off @_
    my $sec = 86400;
    # use int() instead of removing remainder
    my $age = int((UnixDate("now", "%s") - $createtime) / $sec);
    return $age;
}

Нет необходимости объединять операторы в один, но я думаю, чтоЭто хорошая идея, чтобы удалить как можно больше переменных перехода.Однако я чувствую, что необходимо - с точки зрения читабельности и хорошей практики - не объявлять переменные до тех пор, пока вы на самом деле их не используете.Таким образом, когда вы читаете код и видите my $foo = ..., вы знаете , что $foo объявляется и присваивается тогда и там.

Вы можете даже удалить переменную $age, ноЯ чувствую, что это добавляет что-то к читабельности, чтобы оставить это.

2 голосов
/ 12 марта 2012

Мне кажется, что вы пропали без вести

use Switch;

с начала вашей программы. Но это старая версия оператора switch. Если вы используете Perl версии 5.10 или новее, вы можете заменить это на

use feature 'switch';

описано здесь . Синтаксис использует given / when / default вместо switch / case / else, а условия when заключаются в круглые скобки, как и условие if. Ваш код должен стать

sub getName {
  my $tempName = $_[0];
  given ($tempName) {
    when  ('Cart Software') { return 'CART' }
    when ('OX-Gift-Hyderabad') { return 'Gift' }
    default { return $_[0]}
  }
}
0 голосов
/ 12 марта 2012

Модуль Switch реализован как фильтр исходного кода, он читает ваш исходный код и пытается преобразовать операторы switch в действительный код Perl.Я предполагаю, что вам каким-то образом удалось убедить Switch, что / начинает совпадение с регулярным выражением, скрывая ваш switch в том, что он считает шаблоном.В этом случае ваш switch тривиально переписать как поиск хеша, который, вероятно, и безопаснее, и быстрее.

my %name_map = (
    'Cart Software' => 'CART',
    'OX-Gift-Hyderabad' => 'Gift',
);
sub getName {
    my $temp_name = $_[0];
    if (exists $name_map{$temp_name}) {
        return $name_map{$temp_name};
    }
    return $temp_name;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...