Я видел перл заявления, которые выглядят следующим образом:Что делает этот оператор:();
() unless $some_var;
Что, что намерен добиться?
Я видел перл заявления, которые выглядят следующим образом:Что делает этот оператор:();
() unless $some_var;
Что, что намерен добиться?
если выполняет инструкцию один раз в том и только в том случае, если условие истинно.
unless
является противоположным, он выполняет утверждение, если условие не является истинным (то есть, если условие является ложным).
см подробнее: http://perldoc.perl.org/perlsyn.html
() является лишь пустой список, так что этот код обеспечивает значение по умолчанию пустой список для случаев, когда $ some_var ложна (вероятно, из-за $ some_var не определено).
Спасибо, я понимаю часть «если», но почему «()»? Что делает пустой список? – Tony
Он возвращает пустой список, если $ some_var является ложным.
Если я пишу @s =() unless $some_var;
, я опустошил @s
если $some_var
ложно.
Это единственный способ, которым это можно использовать. Я могу придумать.
Спасибо - извините, если я не был ясен, но это все само по себе - нет назначения. – Tony
Это, вероятно, используется в неявном возврате, если $some_var
оценивает значение true, возвращает его, в противном случае возвращает пустой список.
+1 только полезный ответ atm –
Спасибо - не уверен, как это может работать, поскольку оно встречается в начале скрипта, а не в подпрограмме, и тот же скрипт заканчивается выходом (0); – Tony
Имейте в виду, что при выходе из подпрограммы возвращаемое значение является последним обработанным значением (или, если есть оператор 'return', независимо от того, что вызывал оператор' return'). –
На себе это выражение является nop. Но значение (пустой список) может быть автоматически возвращено из подпрограммы или блока do(), если нет явного оператора return, и это значение является последним в блоке.
Спасибо, мне нравится эта теория ... но она находится рядом с основной рутиной, после нее происходит много всего :-( – Tony
Здесь есть несколько вещей, но самым значительным является тот факт, что такая линия обычно появляется как последняя строка исполняемого блока [1]. В этом контексте значением блока является значение последнего выполненного оператора [2]. Теперь утверждение, содержащее unless
, имеет значение левой части, если правая часть имеет значение true и значение правой части в противном случае, поэтому это способ сказать: «значение блока равно $some_var
, если $some_var
это правда, ()
в противном случае ".
()
просто пустой список, так что этот код обеспечивает значение по умолчанию пустой список для случаев, когда $some_var
является ложным (возможно, потому, что $some_var
не определен.)
Это больше обычного, чтобы добиться того же эффекта с or
, как в эквивалентной
$some_var or();
Соединенный, мы можем видеть эти случаи:
use strict;
use warnings;
my @x = do {() unless 0 };
my @y = do {() unless 5 };
print "\@x: <@x>\n\@y: <@y>\n";
@x
- пустой массив, потому что 0
является ложным, тогда как @y
- это массив, содержащий 5
, потому что 5
является истинным.
В любом другом месте, кроме как в последнем заявлении блока, () unless $some_var;
является не-оператором. Он действительно подавляет предупреждение once
, если не указано иное $some_var
.
[1]: Это блок-оценивали eval
или do
или подается (например) map
или grep
, или блок называется в качестве подпрограммы.
[2]: «Значение последнего выполненного оператора» - это странная фраза; в основном только выражения имеют значения. Но поскольку Perl включает понятие о том, что в отсутствие явного возврата значение блока является значением последнего оператора, Perl нуждается в этой странной фразе.
Благодарим вас за подробный анализ: похоже, что здесь не происходит (если что-то). Вот немного больше сценария, многие последующие коды опущены, и он, наконец, заканчивается на 'exit (0);': # - MAIN -------------- -------------------------------------------------- ------- GetOptions ("-interactive", " -request_file = s",) или использования(); использования, если ($ opt_request_file); (), если ($ opt_interactive); $ today = strftime ".% Y-% m-% d", localtime; $ dte = strftime "% Y-% m-% d", localtime; @col = ("M", "N", "O", "P", "Q", "R", "S"); . , , – Tony
Извините, если я отформатировал это плохо, просто вырезал и вставлял из шпатлевки, выглядел нормально в этом текстовом поле :-( – Tony
В этом контексте он выглядит как нет-op для меня. В предположении, что интерактивный вариант фактически не реализован , и инструкция if не существует в качестве владельца места для некоторого кода, который никогда не был написан. Я бы без колебаний удалил его. – darch
Тайна решена:
GetOptions(
"-interactive",
"-request_file=s",
) or usage();
usage unless ($opt_request_file);
() unless ($opt_interactive);
Кажется '();' вводит в заблуждение - он ничего не делает, и целью является просто указать переменную $ opt_interactive один раз ... как способ подавить предупреждение perl «Имя» $ var «используется только один раз».
Спасибо всем, кто попытался пролить свет!
Просьба показать фактический сценарий, содержащий это утверждение. – kennytm
Включите еще один код из вашего скрипта, чтобы правильно его понять, в котором используется контекст(). –