Как я могу пытаться, если стоимость booleano фальшивая в Perl?

Официальная документация функции unlink он говорит, что он будет false если есть какая-то ошибка, но когда я пробую тестировать Вашу стоимость видеть, фальшивый ли он, составитель ненавидит меня:

#!/usr/bin/perl

use utf8;
use strict;
use warnings;

my $fichero = "una_prueba";

if (system("touch", $fichero) != 0) {
    die "No se pudo crear $fichero (estatus $?)";
}

print "Fichero $fichero creado.\n";

if (unlink($fichero) == false) {
    die "No se pudo remover $fichero: $!";
}

print "Fichero $fichero removido.\n";

exit(0);

Когда я пробую составлять эту программу, составитель дает мне эту ошибку и он ничего не делает:

Bareword "false" not allowed while "strict subs" in use at ejemplo-falso line 15.
Execution of ejemplo-falso aborted due to compilation errors.

Думая, что он, может быть, был должен помечать стоимость как цепь, я это изменил так:

if (unlink($fichero) == "false") {

Когда я это сделал, этот раз программа да смогла работать, но с этой загадочной жалобой:

Fichero una_prueba creado.
Argument "false" isn't numeric in numeric eq (==) at ejemplo-falso line 15.
Fichero una_prueba removido.

Ввиду того, что оно функционировало правильно: какая-то проблема есть действительно несмотря на то, что это пишет так?

Нужно замечать в это предупреждение там — или нет?

Действительно, фундаментальный вопрос здесь: как он проистекает (или не нужно) сравнивать стоимость booleano в Perl?


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

7
задан 23.05.2017, 15:39
2 ответа

Каждое выражение в Perl может быть оцененным в контексте booleano.

if ( **alguna expresión** ) {
    # Caso verdadero
} else {
    # Caso falso
}

Тогда, в твоем примере:

if ( unlink($fichero) ) {
    print "Fichero $fichero removido.\n";
} else {
    die "No se pudo remover $fichero: $!";
}

Или если ты только хочешь протестировать фальшивый случай, ты можешь отрицать такое выражение:

if ( ! unlink($fichero) ) {
    die "No se pudo remover $fichero: $!";
}

Есть другие формы также; ты можешь выбирать согласно твоему предпочтению и контексту:

unlink($fichero) or die "No se pudo removar $fichero: $!";

В этом случае, Perl будет выполнять это справа от or, только, если это в левую сторону он оценивается как фальшиво. (Если ты хочешь выполнить это только в истинном случае, я изменился or для одного and). Замечание: ты можешь использовать || вместо or и && вместо and.

Также есть тройной оператор:

unlink($fichero)
    ? print "Fichero $fichero removido.\n"
    : die "No se pudo remover $fichero: $!";

Во всех случаях, Perl решает, что которые выражения "истинные" и "фальшивые" согласно правилам, которые могут быть упрощенными так. Следующая стоимость фальшивая. Остальное они истинные:

  • undef
  • 0 (номер ноль)
  • "" (пустой string)
  • "0" (string, который содержит только "нуль")
  • Любой объект blessed, что перегружает превращение booleano, чтобы возвращаться фальшиво
  • Ты заносишь в список и hashes ты опустошаешь

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

  • "0.0" он истинный
  • "0.0"+0 он фальшивый, потому что он оценен в числовом, и таком контексте, он она следует есть 0 что фальшивый)
  • 2-3+1 он фальшивый, потому что это математическое выражение, которое следует в 0
6
ответ дан 01.12.2019, 08:16
  • 1
    Вышеупомянутое добро. Я хотел бы в и # 241; adir, что (возможно говорить что) в Perl существует другая фальшивая стоимость, о которой не упомянул никто: стоимость, которая приходит из сравнительных операторов как (0 > 1). Это вид фальшивого, что стоит такие "" как цепь и 0 как n и # 250; морской окунь, но он не вызывает предупреждения, когда он используется как n и # 250; морской окунь как s и # 237; tendr и # 237; схвати, если его было undef. Иногда этой специальной стоимости называет фальшивый м и # 225; gico , или же magic false в ingl и # 233; в. – tchrist 08.12.2015, 12:58
  • 2
    @tchrist: Ты говоришь dualvar ? Pens и # 233; упоминать об этом, но две стоимость dualvar (0, " ") они фальшивые, тогда он не меняет этот ответ. Схвати и # 237; он не был уверен, было ли благоразумным упоминать об этой детали. Но я могу в и # 241; adir конечно ты думаешь, что быть и # 225; ценный. – Flimzy 08.12.2015, 13:07
  • 3
    Не dualvar espec и # 237; ficamente. Я говорю о PL_sv_no, которые ты можешь находить или в c и # 243; я говорю C perl, или в documentaci и # 243; n perlapi . Если decompilas программа perl, что использует эту стоимость, например с командой perl -MO=Concise,-exec -e 'print 0 > 1', видеть и # 225; s, чего называет это sv_no all и # 237; (потому что decompilador всегда снимает префикс PL_). – tchrist 08.12.2015, 13:18
  • 4
    @tchrist: Я думаю, что я не такой опытный, чтобы разрабатывать в этом уровне учеников закрытого учебного заведения Perl. Если ты хочешь в и # 241; adir этот informaci и # 243; n в ответ, вперед... – Flimzy 08.12.2015, 13:19

У Perl нет типа информации booleano как другие языки и этим он не имеет размещенных слов (keywords) для такого конца, такие как false или true.

Однако оцени выражения booleanas все время для принятия решений.

В одном if, любое выражение, которое возвращало бы 0, '' или undef он принимается как фальшивый и оставшаяся часть принимает как истинную (видеть другие случаи фальшивого внизу).

Чтобы решать твою проблему, ты был бы должен изменять блок if следующего способа:

if (!unlink($fichero)) { 
   die "No se pudo remover $fichero: $!";
} 

Лично, я изменился бы также if из-за выражений, которые включали бы операторы and и or. Что на практике равняются в if и else соответственно.

# si es !== 0 (verdadero), evalua el die.
system("touch", $fichero) && die "No se pudo crear $fichero (estátus $?)";

print "Fichero $fichero creado.\n";

# si es falso, evalua el die
unlink($fichero) || die "No se pudo remover $fichero: $!";

Больше случаев, которые возвращаются фальшиво:

  • Непременно увидь ответ @Flimzy, включи очень хорошие замечания на других случаях, где он может следовать в фальшивом.

  • Существует другая фальшивая стоимость: стоимость, которая приходит из сравнительных операторов как (0> 1). Это вид фальшивого, что стоит "" как цепь и 0 как число, но не вызывает предупреждения, когда он используется как число как будто ты имел бы, если бы он пошел undef. Эту специальную стоимость называются фальшивый волшебник иногда. (*)

Согласно этому post в stack overflow, есть другие варианты, которые также считаются фальшивым в условных:

0
'0'
undef
''  # Empty scalar
()  # Empty list
('')
2
ответ дан 01.12.2019, 08:16

Теги

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