Там нет операции, чтобы сбросить/DELE т. е. переменную. Единственный раз, когда переменная становится снята с охраны снова в конце вызова функции, когда это неиспользуемый аргумент функции используется в качестве локальной переменной:
$ cat tst.awk
function foo(arg) {
if ((arg=="") && (arg==0)) {
print "arg is not set"
}
else {
printf "before assignment: arg=<%s>\n",arg
}
arg = rand()
printf "after assignment: arg=<%s>\n",arg
print "----"
}
BEGIN {
foo()
foo()
}
$ awk -f tst.awk file
arg is not set
after assignment: arg=<0.237788>
----
arg is not set
after assignment: arg=<0.291066>
----
так что если вы хотите, чтобы выполнить какие-либо действия А, то задана переменная X а затем выполните действия B, вы можете инкапсулировать A и/или B в функции, используя X в качестве локального var.
Обратите внимание, что значение по умолчанию равно нулю или нулевому, а не нулю или false, так как это тип «числовая строка».
Вы тест для снято с переменным, сравнивая его как утративший нуль:
$ awk 'BEGIN{ if ((x=="") && (x==0)) print "y" }'
y
$ awk 'BEGIN{ x=0; if ((x=="") && (x==0)) print "y" }'
$ awk 'BEGIN{ x=""; if ((x=="") && (x==0)) print "y" }'
Если вам нужно иметь переменные вы удалить, то вы всегда можете использовать массив из одного элемента:
$ awk 'BEGIN{ if ((x[1]=="") && (x[1]==0)) print "y" }'
y
$ awk 'BEGIN{ x[1]=""; if ((x[1]=="") && (x[1]==0)) print "y" }'
$ awk 'BEGIN{ x[1]=""; delete x; if ((x[1]=="") && (x[1]==0)) print "y" }'
y
, но ИМХО, что запутывает ваш код.
Каким будет прецедент для отключения переменной? Что бы вы сделали с этим, что вы не можете сделать с var=""
или var=0
?
Все началось в [этот ответ] (http://stackoverflow.com/a/33942659/1983854) при попытке удалить переменную 'stack'. Для меня это выглядело немного странно, когда нужно было просто «жестко» «var =» «вместо простого удаления. – fedorqui
Да, я понял, если стек был реализован как массив, вы должны удалить массив, но он реализован как строка, так почему бы вам не удалить его? Ответ в том, что это не так, как вы начинаете строку на любом языке. Конечно, вы всегда можете реализовать его как строку, хранящуюся полностью в 'stack [1]', а затем весело удалять 'stack', но это не улучшит читаемость вашего кода! –
@EdMorton 'awk 'BEGIN {a = 0; if (a == b && length (b)> 0) print 5} '' он может работать? –