ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: Alexey Tourbin <at@altlinux.ru>
To: ALT Devel discussion list <devel@lists.altlinux.org>
Subject: Re: [devel] I: perl.req vs BEGIN
Date: Fri, 15 Aug 2008 16:12:10 +0400
Message-ID: <20080815121210.GP618@altlinux.org> (raw)
In-Reply-To: <48A56FCE.9030002@altlinux.ru>

[-- Attachment #1: Type: text/plain, Size: 2955 bytes --]

On Fri, Aug 15, 2008 at 04:00:14PM +0400, Alexey Gladkov wrote:
> Пишу сюда, чтобы разметить возможную 
> граблю. Нарвался тут при сборке
> пакета с такой ошибкой:
> 
> /usr/lib/groff/groffer is not an existing directory; at 
> /tmp/groff-buildroot/usr/bin/groffer line 145.
> BEGIN failed--compilation aborted at /tmp/groff-buildroot/usr/bin/groffer 
> line 167.
> # perl(func.pl) at line 157 (depth 5) not loaded at BEGIN SKIP
> # perl(man.pl) at line 158 (depth 5) not loaded at BEGIN SKIP
> /tmp/groff-buildroot/usr/bin/groffer: deparse failed. 
> isPerl=0.0409154403404476.
> find-requires: ERROR: /usr/lib/rpm/perl.req failed
> 
> Ошибка несколько интересная. Смотрим в 
> код утилиты groffer:
> 
> BEGIN {
> ...
>    die "$groffer_libdir is not an existing directory;"
>      unless -d $groffer_libdir;
> 
>    unshift(@INC, $groffer_libdir);
> ...
>    require 'func.pl';
>    require 'man.pl';
> ...
> }
> 
> Как видно во время проверки зависимостей 
> реально отработал код скрипта и
> разумеется вышел с ошибкой, и этим 
> завалил сборку пакета.
> 
> После консультаций с at@, выяснилось, что 
> блок BEGIN отрабатывает в perl
> *всегда*... даже при syntax check.

Блок BEGIN выполняется всегда и ASAP (прямо во время чтения кода),
потому что одно из его назначений -- повлиять на синтаксис последующего
кода.  Например, в перле можно вызывать функции без скобок.  Для этого
до того, как прел начал парсить вызов функции без скобок, он уже должен
знать, какие названия функций существуют.

Директива "use" импортирует названия функций на стадии BEGIN.

$ perl -e 'use Carp qw(croak); croak "oh my"'                 
oh my at -e line 1
$

Вызов без скобок возможен только за счёт того, что когда перл парсил
croak, то он уже знал, что существует такая функция croak (которая была
импортирована с помощью use), и поэтому он "понял", что это на самом
деле вызов функции.

$ perl -e 'require Carp; Carp->import("croak"); croak "oh my"' 
String found where operator expected at -e line 1, near "croak "oh my""
        (Do you need to predeclare croak?)
syntax error at -e line 1, near "croak "oh my""
Execution of -e aborted due to compilation errors.
$ perl -e 'require Carp; Carp->import("croak"); croak("oh my")'
oh my at -e line 1
$ 

> Таким образом, хочу предостеречь всех 
> кто пакует перловые скрипты: если у вас в 
> скрипте есть блок BEGIN, то будьте готовы, 
> что он выполнится нашим rpm во время 
> сборки.
> 
> Как варианты обхода:
> 1) Заменить BEGIN на обычный блок (если в нём 
> есть проверки, как
>   в моём случае).
> 2) Отключить поиск зависимостей в перл 
> скриптах :)

Обычно не следует выполнять прикладной код в BEGIN.
BEGIN зарезервирован для всяких хитрых штук.

Одна из таких хитрых штук называется use.
Согласно 'perldoc -f use', выражение
	use Module LIST;
полностью эквивалентно
	BEGIN { require Module; Module->import( LIST ); }

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

  reply	other threads:[~2008-08-15 12:12 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-15 12:00 Alexey Gladkov
2008-08-15 12:12 ` Alexey Tourbin [this message]
2008-08-15 12:26   ` Alexey Gladkov
2008-08-15 12:32     ` Alexey Tourbin
2008-08-15 13:08     ` Alexey I. Froloff
2008-08-15 13:17       ` Alexey Gladkov
2008-08-15 13:33         ` Led
2008-08-15 13:42           ` Alexey Gladkov
2008-08-15 13:51             ` Led
2008-08-18  7:01 ` Stanislav Ievlev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080815121210.GP618@altlinux.org \
    --to=at@altlinux.ru \
    --cc=devel@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git