Solution 1: $applicant = Applicant::get(); foreach ($applicant as $key => $value) { $year = now()->diffInYears($value->birthdate); if($year > 17){ Applicant::where('id', $value->id)->delete(); } }
Второй способ - сначала вам нужно создать одну команду, чтобы вы могли создать правильное программирование и хороший способ.
Следуйте этому примеру
https://itsolutionstuff.com/post/example-of-cron-job-in-laravel-5example.html
Пут код выше в методе handel ()
public function handle() { $applicant = Applicant::get(); foreach ($applicant as $key => $value) { $year = now()->diffInYears($value->birthdate); if($year > 17){ Applicant::where('id', $value->id)->delete(); } } }
Банальный ответ - то, что необходимо использовать local
потому что my *FH
синтаксическая ошибка.
"Право" (но не очень поучительный) ответ - то, что Вы делаете его неправильно. Необходимо использовать лексические дескрипторы файлов и форму с тремя аргументами open
вместо этого.
sub newopen {
my $path = shift;
my $fh;
open($fh, '<', $path) or do {
warn "Can't read file '$path' [$!]\n";
return;
}
return $fh;
}
Действительно ответить, почему требует объяснения различия между лексическими и глобальными переменными и между объемом переменной и его продолжительностью.
Объемом переменной является часть программы, где ее имя допустимо. Объемом является статическое свойство. Продолжительность переменной, с другой стороны, является динамическим свойством. Продолжительность является временем во время осуществления программы, что переменная существует и содержит значение.
my
объявляет лексическую переменную. Лексические переменные имеют объем от точки объявления в конец блока включения (или файл). У Вас могут быть другие переменные с тем же именем в различных объемах без конфликта. (Вы можете также снова использовать имя в наложении объемов, но не делаете этого.) Продолжительностью лексических переменных управляют посредством подсчета ссылок. Пока существует по крайней мере одна ссылка на переменную, значение существует, даже если имя не допустимо в конкретном объеме! my
также имеет эффект во время выполнения - он выделяет новую переменную с именем.
local
несколько отличается. Это воздействует на глобальные переменные. Глобальные переменные имеют глобальную область видимости (имя допустимо везде), и продолжительность всего срока действия программы. Что local
делает, вносят временное изменение в значение глобальной переменной. Это иногда упоминается как "динамический обзор". Изменение запускается при local
объявление и сохраняется до конца блока включения, после которого восстанавливается старое значение. Важно отметить, что новое значение не ограничивается блоком - это видимо везде (включая названные подпрограммы). Правила подсчета ссылок все еще применяются, таким образом, можно взять и сохранить ссылку на локализованное значение после того, как изменение истекло.
Назад к примеру: *FH
глобальная переменная. Более точно это - "typeglob" - контейнер для ряда глобальных переменных. typeglob содержит слот для каждого из типов основной переменной (скаляр, массив, хеш) плюс несколько других вещей. Исторически, Perl использовал typeglobs для хранения дескрипторов файлов и local
- izing их помог гарантировать, что они не ударили друг друга. Лексические переменные не имеют typeglobs, который является почему высказывание my *FH
синтаксическая ошибка.
В современных версиях Perl лексические переменные могут и должны использоваться в качестве дескрипторов файлов вместо этого. И это возвращает нас "правильному" ответу.
В Вашем примере кода, вызове к созданному в подпрограмме open
использует пустое слово в качестве дескриптора файла, который является эквивалентом глобальной переменной. Как объясненный ответ Nathan Fellman, с помощью local
локализует это пустое слово к текущему блоку кода, если другая глобальная переменная с тем же именем определяется в другом месте в сценарии или модуле. Это будет препятствовать тому, чтобы ранее определенная глобальная переменная была вытерта новым объявлением.
Это было очень обычной практикой в старые дни Perl, но с Perl 5.6 намного лучше использовать скаляр (с my
объявление, что Вы подсказали в Вашем вопросе) для определения дескриптора файла и, дополнительно, используют три вызова аргумента для open
.
use Carp;
open my $error_log, '>>', 'error.log' or croak "Can't open error.log: $OS_ERROR";
Как в стороне, обратите внимание на то, что для стандартного чтения ввода/вывода и записи, еще лучше использовать два аргумента open
:
use Carp;
open my $stdin, '<-' or croak "Can't open stdin: $OS_ERROR";
С другой стороны, можно использовать IO::File
модуль для благословения дескриптора файла к классу:
use IO::File;
my $error_log = IO::File->new('error.log', '>>') or croak "Can't open error.log: $OS_ERROR");
Большинство кредита здесь переходит к Damian Conway, автору превосходных книжных Лучших практик Perl. Если Вы серьезно относитесь к разработке Perl, Вы должны ее себе для покупки этой книги.
Почему Вы читаете устаревшую книгу. 3-й Выпуск отсутствовал в течение долгого времени! Какую версию Perl Вы используете? 2-й Выпуск описывает Perl 5.004 (5.4.x) или поблизости.
В эти дни Вы не должны использовать typeglob нотацию для дескрипторов файлов; используйте 'лексические дескрипторы файлов' (см. открытый, я думаю), или модуль FileHandle или один из его родственников вместо этого.
Благодаря Michael Schwern и Ysth для комментариев, включенных здесь.
Посмотрите Локализованные Дескрипторы файлов здесь, я предполагаю, что это объясняет это.
Я полагаю, что это потому что my
выделяет новую копию переменной на стеке, и это потеряно при выходе из блока. local
сохраняет существующее *FH
в другом месте и переопределения существующее *FH
. Это восстанавливает старый при выходе из стека. С my
*FH
typeglob выходит из объема при выходе из блока. С local
это сохраняет существующий, таким образом, можно продолжить использовать его после возврата его.
Я не на 100% уверен в этом, но возможно это может указать на Вас в правильном направлении.