Ответы выше, теперь устарели из-за нового синтаксиса конвейера. Ниже распечатываются переменные среды.
script {
sh 'env > env.txt'
String[] envs = readFile('env.txt').split("\r?\n")
for(String vars: envs){
println(vars)
}
}
Они не добавляют реальный GOTO, но расширяют ключевое слово ПОВРЕЖДЕНИЯ для использования статических маркировок. В основном это будет улучшать способность убежать из переключателя, вложенного если операторы. Вот пример понятия, который я нашел:
<?php
for ($i = 0; $i < 9; $i++) {
if (true) {
break blah;
}
echo "not shown";
blah:
echo "iteration $i\n";
}
?>
Конечно, после того как "слух" GOTO отсутствовал, не было ничего для остановки некоторых злых парней для распространения дополнительной шутки МЕСТОЖИТЕЛЬСТВА. Будьте на пальцах ног.
См. также:
Предоставленный, я не PHP программист, и я не знаю то, на что точная реализация PHP GOTO будет похожа, но здесь является моим пониманием GOTO:
GOTO является просто более явным оператором управления потоком как любой другой. Скажем, у Вас есть некоторые вложенные циклы, и только необходимо найти одну вещь. Можно вставить условный оператор (или несколько) и когда условия соблюдают правильно, можно использовать Оператор перехода для выхода из всех циклов, (вместо того, чтобы иметь оператор 'повреждения' на каждом уровне вложения с условным оператором для каждого. И да, я полагаю, что традиционная реализация должна назвать маркировки, к которым может перейти Оператор перехода по имени. Можно сделать что-то вроде этого:
for(...) {
for (...) {
for (...) {
// some code
if (x) GOTO outside;
}
}
}
:outside
Это - более простое (и более эффективный) реализация, чем без Операторов перехода. Эквивалент был бы:
for(...) {
for (...) {
for (...) {
// some code
if (x) break;
}
if(x) break;
}
if(x) break;
}
Во втором случае (который является обычной практикой) существует три условных оператора, который, очевидно, медленнее, чем просто наличие того. Так, по причинам оптимизации/упрощения Вы могли бы хотеть использовать Операторы перехода в плотно вложенных циклах.
В примере, данном steveth45, можно использовать функцию вместо этого:
function findItem(...) {
for (...) {
for (...) {
for (...) {
if (x) {
return theItem;
}
}
}
}
}
// no need for label now
theItem = findItem(a, b, c);
Похоже, что это в настоящее время находится в PHP 5.3, но еще не полностью документируется. Из того, что я могу сказать, что это совместно использует свой goto синтаксис с C, таким образом, должно быть легко взять и использовать. Просто помните предупреждение Dijkstra и используйте его только при необходимости.
@steveth45
Мое эмпирическое правило - то, что при вложении кода больше чем 3 уровня глубоко Вы делаете что-то не так.
Затем Вы не должны волноваться об использовании нескольких операторов завершения или goto :D
Я всегда удивлялся тому, насколько невероятно тупы дизайнеры PHP. Если целью использования GOTO является выход из множества вложенных циклы более эффективны, есть лучший способ: маркированные блоки кода и операторы break, которые могут ссылаться на метки:
a: for (...) {
b: for (...) {
c: for (...) {
...
break a;
}
}
}
Теперь ясно, из какого цикла / блока нужно выйти, и выход структурирован; вы не можете получить спагетти-код с этим, как с настоящими goto.
Это старая, старая, старая идея. Разработка хорошего управления потоком управления конструкции решаются с 70-х годов, и литература по всему этому давно написано. Теорема Бома-Якопини показала, что вы можете кодировать что угодно с помощью вызова функции, if-then-else и циклов while. На практике, чтобы вырваться из глубоко вложенных блоков, стиль Бома-Якопини кодирование требовало дополнительных логических флагов («установите этот флаг, чтобы выйти из цикла») который был неуклюжим и неэффективным (вам не нужны такие флаги в вашем внутреннем цикле). С if-then-else различные циклы (while, for) и помеченный блок, вы можете закодировать любой алгоритм без каких-либо потеря эффективности. Почему бы людям вместо этого не читать литературу копирования, что сделал C? Grrr.