2010-08-25 2 views
3

Я видел перл заявления, которые выглядят следующим образом:Что делает этот оператор:();

() unless $some_var; 

Что, что намерен добиться?

+2

Просьба показать фактический сценарий, содержащий это утверждение. – kennytm

+1

Включите еще один код из вашего скрипта, чтобы правильно его понять, в котором используется контекст(). –

ответ

0

если выполняет инструкцию один раз в том и только в том случае, если условие истинно.

unless является противоположным, он выполняет утверждение, если условие не является истинным (то есть, если условие является ложным).

см подробнее: http://perldoc.perl.org/perlsyn.html

() является лишь пустой список, так что этот код обеспечивает значение по умолчанию пустой список для случаев, когда $ some_var ложна (вероятно, из-за $ some_var не определено).

+5

Спасибо, я понимаю часть «если», но почему «()»? Что делает пустой список? – Tony

0

Он возвращает пустой список, если $ some_var является ложным.

Если я пишу @s =() unless $some_var;, я опустошил @s если $some_var ложно.

Это единственный способ, которым это можно использовать. Я могу придумать.

+1

Спасибо - извините, если я не был ясен, но это все само по себе - нет назначения. – Tony

1

Это, вероятно, используется в неявном возврате, если $some_var оценивает значение true, возвращает его, в противном случае возвращает пустой список.

+0

+1 только полезный ответ atm –

+0

Спасибо - не уверен, как это может работать, поскольку оно встречается в начале скрипта, а не в подпрограмме, и тот же скрипт заканчивается выходом (0); – Tony

+0

Имейте в виду, что при выходе из подпрограммы возвращаемое значение является последним обработанным значением (или, если есть оператор 'return', независимо от того, что вызывал оператор' return'). –

1

На себе это выражение является nop. Но значение (пустой список) может быть автоматически возвращено из подпрограммы или блока do(), если нет явного оператора return, и это значение является последним в блоке.

+0

Спасибо, мне нравится эта теория ... но она находится рядом с основной рутиной, после нее происходит много всего :-( – Tony

9

Здесь есть несколько вещей, но самым значительным является тот факт, что такая линия обычно появляется как последняя строка исполняемого блока [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 нуждается в этой странной фразе.

+0

Благодарим вас за подробный анализ: похоже, что здесь не происходит (если что-то). Вот немного больше сценария, многие последующие коды опущены, и он, наконец, заканчивается на '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

+0

Извините, если я отформатировал это плохо, просто вырезал и вставлял из шпатлевки, выглядел нормально в этом текстовом поле :-( – Tony

+4

В этом контексте он выглядит как нет-op для меня. В предположении, что интерактивный вариант фактически не реализован , и инструкция if не существует в качестве владельца места для некоторого кода, который никогда не был написан. Я бы без колебаний удалил его. – darch

3

Тайна решена:

GetOptions(
    "-interactive", 
    "-request_file=s", 
) or usage(); 

usage unless ($opt_request_file); 
() unless ($opt_interactive); 

Кажется '();' вводит в заблуждение - он ничего не делает, и целью является просто указать переменную $ opt_interactive один раз ... как способ подавить предупреждение perl «Имя» $ var «используется только один раз».

Спасибо всем, кто попытался пролить свет!

Смежные вопросы