Почему Программирование Perl использует локальный (не мой) для дескрипторов файлов?

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();
              }
          }
        }
11
задан brian d foy 18 September 2009 в 22:43
поделиться

5 ответов

Банальный ответ - то, что необходимо использовать 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 лексические переменные могут и должны использоваться в качестве дескрипторов файлов вместо этого. И это возвращает нас "правильному" ответу.

25
ответ дан 3 December 2019 в 00:49
поделиться

В Вашем примере кода, вызове к созданному в подпрограмме 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, Вы должны ее себе для покупки этой книги.

20
ответ дан 3 December 2019 в 00:49
поделиться

Почему Вы читаете устаревшую книгу. 3-й Выпуск отсутствовал в течение долгого времени! Какую версию Perl Вы используете? 2-й Выпуск описывает Perl 5.004 (5.4.x) или поблизости.

В эти дни Вы не должны использовать typeglob нотацию для дескрипторов файлов; используйте 'лексические дескрипторы файлов' (см. открытый, я думаю), или модуль FileHandle или один из его родственников вместо этого.


Благодаря Michael Schwern и Ysth для комментариев, включенных здесь.

12
ответ дан 3 December 2019 в 00:49
поделиться

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

0
ответ дан 3 December 2019 в 00:49
поделиться

Я полагаю, что это потому что my выделяет новую копию переменной на стеке, и это потеряно при выходе из блока. local сохраняет существующее *FH в другом месте и переопределения существующее *FH. Это восстанавливает старый при выходе из стека. С my *FH typeglob выходит из объема при выходе из блока. С local это сохраняет существующий, таким образом, можно продолжить использовать его после возврата его.

Я не на 100% уверен в этом, но возможно это может указать на Вас в правильном направлении.

0
ответ дан 3 December 2019 в 00:49
поделиться
Другие вопросы по тегам:

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