Почему я не могу присвоить @b || @c к @a в Perl?

Короткий ответ является 'нет'. Когда я записал ecryptfs-setup-private, я выбрал ряд значений по умолчанию для eCryptfs, который я считал разумным, безопасным и приемлемым для миллионов пользователей Ubuntu, которые не будут заботиться очень о tunables по долгому пути. Это ограничило количество комбинаций конфигурации, которые мы должны были протестировать и поддержка.

, Как Вы отметили, eCryptfs очень настраивается, если Вы читаете эти документы и монтируетесь вручную, в то время как функция Ubuntu Encrypted Private/Home имеет непротиворечивое множество опций везде.

, Кроме того, Bruce Schneier рекомендовал против использования AES256, в пользу AES128:

И для новых приложений я предлагаю, чтобы люди не использовали AES-256. AES-128 обеспечивает более чем достаточно запаса надежности для обозримого будущего.

12
задан brian d foy 31 August 2009 в 20:45
поделиться

4 ответа

Оператор логического ИЛИ (« || ») оценивает свой левый аргумент в скалярном контексте.

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


Из perldoc perlop «C-style-Logical-Or»

Binary » || ] "выполняет короткое замыкание логической операции ИЛИ. То есть, если левый операнд истина , правый операнд даже не оценивается. ...


Из perldoc perldata «Скалярные значения» :

.... Логический контекст - это просто особый вид скалярного контекста, в котором нет преобразования к строке или числу.

7
ответ дан 2 December 2019 в 20:18
поделиться

Если вы не можете использовать условный оператор напрямую, вы можете легко использовать немного менее краткий:

my $ref_b = [ @b ]; # Ideally, just return an arrayref from your function
my @a = @$ref_b ? @$ref_b : @c;

Согласно приведенному выше ответу, ваш код не работает, поскольку логический контекст, который левая часть || вычисляется в скалярном контексте, и, таким образом, @b фактически становится скаляр (@b) , и это то, что присваивается @a .

0
ответ дан 2 December 2019 в 20:18
поделиться

В perlop, всего за несколько абзацев до раздела, который вы цитируете:

Binary "||" performs a short-circuit logical OR operation.  That is,
if the left operand is true, the right operand is not even evaluated.
Scalar or list context propagates down to the right operand if it is
evaluated.

Здесь явно не указано, что контекст списка не распространяется на левый операнд, но в верхней части perlop указано:

With very few exceptions, these all operate on scalar values
only, not array values.

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

7
ответ дан 2 December 2019 в 20:18
поделиться

Это потому, что || оценивает левую часть в скалярном контексте, как и тестовый аргумент?:. Если вы не можете использовать троичный, используйте функцию:

sub or_array (\@\@) {
  return @{$_[0]} if ( scalar @{$_[0]} );
  return @{$_[1]};
}

@a = or_array(@b, @c);
2
ответ дан 2 December 2019 в 20:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: