рдпрд╣ рд╡рд╣ рдЖрджреЗрд╢ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реЗ рдХрдИ рдореБрдлреНрдд рдСрдирд▓рд╛рдЗрди рд╡рд░реНрдХрд╕реНрдЯреЗрд╢рди рдЬреИрд╕реЗ рдХрд┐ рдЙрдмрдВрдЯреВ рдСрдирд▓рд╛рдЗрди, рдлреЗрдбреЛрд░рд╛ рдСрдирд▓рд╛рдЗрди, рд╡рд┐рдВрдбреЛрдЬ рдСрдирд▓рд╛рдЗрди рдПрдореБрд▓реЗрдЯрд░ рдпрд╛ рдореИрдХ рдУрдПрд╕ рдСрдирд▓рд╛рдЗрди рдПрдореБрд▓реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдирд╡рд░реНрдХреНрд╕ рдлреНрд░реА рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкреНрд░рджрд╛рддрд╛ рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрд╛рд░реНрдпрдХреНрд░рдо:
рдирд╛рдо
рдкреЗрд░рд▓реЗрдореНрдмреЗрдб - рдЕрдкрдиреЗ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдкрд░реНрд▓ рдХреЛ рдХреИрд╕реЗ рдПрдореНрдмреЗрдб рдХрд░реЗрдВ
рд╡рд░реНрдгрди
рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛
рдХреНрдпрд╛ рдЖрдк рдХрд░рдирд╛ рдпрд╣ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
рдЙрдкрдпреЛрдЧ C рд╕реЗ рдкрд░реНрд▓?
Perlxstut, perlxs, h2xs, perlguts, рдФрд░ perlapi рдкрдврд╝реЗрдВред
рдЙрдкрдпреЛрдЧ a рдпреВрдирд┐рдХреНрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдкрд░реНрд▓?
рдкрд░реНрд▓рдлрдВрдХ рдореЗрдВ рдмреИрдХ-рдХреЛрдЯреНрд╕ рдФрд░ "рд╕рд┐рд╕реНрдЯрдо" рдФрд░ "рдПрдХреНрдЬреАрдХреНрдпреВрдЯрд┐рд╡" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВред
рдЙрдкрдпреЛрдЧ рдкрд░реНрд▓ рд╕реЗ рдкрд░реНрд▓?
Perlfunc рдореЗрдВ "do" рдФрд░ perlfunc рдореЗрдВ "eval" рдФрд░ perlfunc рдореЗрдВ "require" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВ рдФрд░
perlfunc рдореЗрдВ "рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ"ред
рдЙрдкрдпреЛрдЧ C рд╕реЗ C?
рдЕрдкрдиреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ.
рдЙрдкрдпреЛрдЧ рдкрд░реНрд▓ рд╕реЗ C?
рдкрдврд╝рддреЗ рд░рд╣рд┐рдпреЗ...
рд░реЛрдбрдореИрдк
┬╖ рдЕрдкрдиреЗ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛
┬╖ рдЕрдкрдиреЗ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдПрдХ рдкрд░реНрд▓ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЬреЛрдбрд╝рдирд╛
┬╖ рдЕрдкрдиреЗ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдкрд░реНрд▓ рд╕рдмрд░реВрдЯреАрди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛
┬╖ рдЖрдкрдХреЗ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдкрд░реНрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛
┬╖ рдЖрдкрдХреЗ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдкрд░реНрд▓ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдФрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд░рдирд╛
┬╖ рдЖрдкрдХреЗ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдкрд░реНрд▓ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝
┬╖ рд▓рдЧрд╛рддрд╛рд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдмрдирд╛рдП рд░рдЦрдирд╛
┬╖ рдПрдХрд╛рдзрд┐рдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛
┬╖ рдЖрдкрдХреЗ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдкрд░реНрд▓ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЬреЛ рд╕реНрд╡рдпрдВ рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
┬╖ Win32 рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдкрд░реНрд▓ рдХреЛ рдПрдВрдмреЗрдб рдХрд░рдирд╛
рд╕рдВрдХрд▓рди рддреБрдВрд╣рд╛рд░реЗ C рдХрд╛рд░реНрдпрдХреНрд░рдо
рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИ, рддреЛ рдЖрдк рдЕрдХреЗрд▓реЗ рдирд╣реАрдВ рд╣реИрдВред
рдореБрдЦреНрдп рдирд┐рдпрдо: рдкреНрд░реЛрдЧреНрд░рд╛рдореЛрдВ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рддрд░рд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдЬреИрд╕реЗ рдЖрдкрдХрд╛ рдкрд░реНрд▓ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
(рдЪрд┐рд▓реНрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред)
рд╕рд╛рде рд╣реА, рдкрд░реНрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ C рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЗрд╕рдореЗрдВ рд▓рд┐рдВрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдкрд░реНрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп. рдЖрдк рдкреВрдЫреЗрдВ, рд╡рд╣ рдХреНрдпрд╛ рд╣реИ?
рдкрд░реНрд▓ рд╕реНрд╡рдпрдВ C рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ; рдкрд░реНрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрдХрд▓рд┐рдд рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдореЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИ
рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЗ рдкрд░реНрд▓ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (/usr/bin/perl рдпрд╛ рдЙрд╕рдХреЗ рдмрд░рд╛рдмрд░)ред (рдкрд░рд┐рдгрд╛рдо:
рдЖрдк рдЕрдкрдиреЗ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдкрд░реНрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рддрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬрдм рддрдХ рдХрд┐ рдкрд░реНрд▓ рдХреЛ рдЖрдкрдХреА рдорд╢реАрди рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдпрд╛
рдареАрдХ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ--рдЗрд╕реАрд▓рд┐рдП рдЖрдкрдХреЛ рдорд╢реАрди рд╕реЗ рдкрд░реНрд▓ рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯреЗрдмрд▓реНрд╕ рдХреЛ рд▓рд╛рдкрд░рд╡рд╛рд╣реА рд╕реЗ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдмрд┐рдирд╛ рдХреЙрдкреА рдХрд┐рдП рднреА рдорд╢реАрди рдореЗрдВ рдбрд╛рд▓рдирд╛ lib рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ред)
рдЬрдм рдЖрдк рд╕реА рд╕реЗ рдкрд░реНрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрдорддреМрд░ рдкрд░ рдЖрд╡рдВрдЯрд┐рдд, "рд░рди" рдФрд░ рдбреАрд▓реАрд▓реЛрдХреЗрдЯ рдХрд░реЗрдЧрд╛
рдкрд░реНрд▓рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ, рдЬрд┐рд╕реЗ рдкрд░реНрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрджрд┐ рдЖрдкрдХреА рдкрд░реНрд▓ рдХреА рдкреНрд░рддрд┐ рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ (рд╕рдВрд╕реНрдХрд░рдг 5.002 рдпрд╛) рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╡реАрдирддрдо рд╣реИ
рдмрд╛рдж рдореЗрдВ), рдлрд┐рд░ рдкрд░реНрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рдФрд░ рдмрд╛рд╣рд░реА.рдПрдЪ рдФрд░ рдкрд░реНрд▓.рдПрдЪ, рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА) рд╣реЛрдЧреА
рдРрд╕реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдирд┐рд╡рд╛рд╕ рдХрд░реЗрдВ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
/usr/local/lib/perl5/your_architecture_here/CORE
рдпрд╛ рд╢рд╛рдпрдж рдмрд╕
/usr/local/lib/perl5/CORE
рдпрд╛ рд╢рд╛рдпрдж рдРрд╕рд╛ рдХреБрдЫ
/usr/opt/perl5/CORE
CORE рдХрд╣рд╛рдВ рдорд┐рд▓реЗрдЧрд╛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреЗрдд рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХрдерди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдкрд░реНрд▓ -рдПрдордХреЙрдиреНрдлрд┐рдЧ -рдИ 'рдкреНрд░рд┐рдВрдЯ $рдХреЙрдиреНрдлрд┐рдЧ{рдЖрд░реНрдХрд▓рд┐рдм}'
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреИрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВрдЧреЗ, "рдкрд░реНрд▓ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЬреЛрдбрд╝рдирд╛
рдЖрдкрдХрд╛ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо", рдореЗрд░реЗ рд▓рд┐рдирдХреНрд╕ рдмреЙрдХреНрд╕ рдкрд░:
% gcc -O2 -Dbool=char -DHAS_BOOL -I/usr/local/include
-I/usr/local/lib/perl5/i586-linux/5.003/CORE
-L/usr/local/lib/perl5/i586-linux/5.003/CORE
-рдУ рдЗрдВрдЯрд░рдкреА рдЗрдВрдЯрд░рдкреА.рд╕реА -рдПрд▓рдкрд░реНрд▓ -рдПрд▓рдПрдо
(рдпрд╣ рд╕рдм рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИред) рдореЗрд░реЗ рдбреАрдИрд╕реА рдЕрд▓реНрдлрд╛ рдкрд░ рдкреБрд░рд╛рдирд╛ 5.003_05 рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдордВрддреНрд░ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╣реИ
рднрд┐рдиреНрди рд╣реЛ:
% cc -O2 -Olimit 2900 -DSTANDARD_C -I/usr/local/include
-I/usr/local/lib/perl5/alpha-dec_osf/5.00305/CORE
-L/usr/local/lib/perl5/alpha-dec_osf/5.00305/CORE -L/usr/рд╕реНрдерд╛рдиреАрдп/lib
-D__LANGUAGE_C__ -D_NO_PROTO -o interp interp.c -lperl -lm
рдЖрдк рдХреИрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЬреЛрдбрд╝рдирд╛ рд╣реИ? рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЖрдкрдХрд╛ рдкрд░реНрд▓ 5.001 рдХреЗ рдмрд╛рдж рдХрд╛ рд╣реИ, "рдкрд░реНрд▓ -V" рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
рдЖрджреЗрд╢ рджреЗрдВ рдФрд░ "рд╕реАрд╕реА" рдФрд░ "рд╕реАрд╕реАрдлреНрд▓реИрдЧ" рдЬрд╛рдирдХрд╛рд░реА рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдВред
рдЖрдкрдХреЛ рдЙрдкрдпреБрдХреНрдд рдХрдВрдкрд╛рдЗрд▓рд░ рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ (cc, рдЬреАрд╕реАрд╕реА, рдПрдЯ рдЕрд▓.) рдЖрдкрдХреА рдорд╢реАрди рдХреЗ рд▓рд┐рдП: "perl
-MConfig -e 'print $Config{cc}'" рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
рдЖрдкрдХреЛ рдЙрдкрдпреБрдХреНрдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рднреА рдЪреБрдирдиреА рд╣реЛрдЧреА (/usr/рд╕реНрдерд╛рдиреАрдп/lib/...) рдЖрдкрдХреЗ рд▓рд┐рдП
рдорд╢реАрдиред рдпрджрд┐ рдЖрдкрдХрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ, рдпрд╛ рдпрд╣
рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓ рд╕рдХрд╛ -рдПрд▓рдкрд░реНрд▓, рддреЛ рдЖрдкрдХреЛ "-L" рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реБрдП рдкрде рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдЧрд░ рдпрд╣ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ
рдХрд┐ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ рдмрд╛рд╣рд░реА.рдПрдЪ рдФрд░ рдкрд░реНрд▓.рдПрдЪ, рдЖрдкрдХреЛ "-I" рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реБрдП рдкрде рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рдЬреЛрдбрд╝рдиреА рдкрдбрд╝ рд╕рдХрддреА рд╣реИ. рдЬреЛ рд▓реЛрдЧ? рд╢рд╛рдпрдж рдЬрд┐рдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдкрд░реНрд▓ -рдПрдордХреЙрдиреНрдлрд┐рдЧ -рдИ 'рдкреНрд░рд┐рдВрдЯ $рдХреЙрдиреНрдлрд┐рдЧ{libs}'
рдмрд╢рд░реНрддреЗ рдЖрдкрдХреА рдкрд░реНрд▓ рдмрд╛рдЗрдирд░реА рдареАрдХ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХреА рдЧрдИ рд╣реЛ ExtUtils::рдПрдореНрдмреЗрдб рдореЙрдбреНрдпреВрд▓
рдЖрдкрдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛:
% cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
рдЕрдЧрд░ ExtUtils::рдПрдореНрдмреЗрдб рдореЙрдбреНрдпреВрд▓ рдЖрдкрдХреЗ рдкрд░реНрд▓ рд╡рд┐рддрд░рдг рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рд╕реЗ http://www.perl.com/perl/CPAN/modules/by-module/ExtUtils/ (рдпрджрд┐ рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЖрдпрд╛
рдЖрдкрдХреЗ рдкрд░реНрд▓ рд╡рд┐рддрд░рдг рд╕реЗ, рддреЛ рдЖрдк 5.004 рдпрд╛ рдмреЗрд╣рддрд░ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИред)
RSI ExtUtils::рдПрдореНрдмреЗрдб рд╕реАрдкреАрдПрдПрди рдкрд░ рдХрд┐рдЯ рдореЗрдВ рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝, рдкрд░реАрдХреНрд╖рдг, рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрджрд╛рд╣рд░рдг рдФрд░ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдЬреЛ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧреА рд▓рдЧ рд╕рдХрддреА рд╣реИред
рдЬреЛрдбрд╝рдирд╛ a рдкрд░реНрд▓ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕реЗрд╡рд╛ рдореЗрд░реЗ рддреБрдВрд╣рд╛рд░реЗ C рдХрд╛рд░реНрдпрдХреНрд░рдо
рдПрдХ рдЕрд░реНрде рдореЗрдВ, рдкрд░реНрд▓ (рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо) рдкрд░реНрд▓ (рднрд╛рд╖рд╛) рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ
рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реВрдВрдЧрд╛ рдорд┐рдиреАрдкрд░реНрд▓рдореЗрди.рд╕реА, рд╕реНрд░реЛрдд рд╡рд┐рддрд░рдг рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред
рдпрд╣рд╛рдБ рдЗрд╕рдХрд╛ рдШрдЯрд┐рдпрд╛, рдЧреИрд░-рдкреЛрд░реНрдЯреЗрдмрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдорд┐рдиреАрдкрд░реНрд▓рдореЗрди.рд╕реА рдХреА рдЕрдирд┐рд╡рд╛рд░реНрдпрддрд╛ рдпреБрдХреНрдд
рдПрдореНрдмреЗрдбрд┐рдВрдЧ:
#рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ /*рдкрд░реНрд▓ рд╡рд┐рддрд░рдг рд╕реЗ*/
#рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ /*рдкрд░реНрд▓ рд╡рд┐рддрд░рдг рд╕реЗ*/
рд╕реНрдерд┐рд░ рдкрд░реНрд▓рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ *my_perl; /*** рдкрд░реНрд▓ рджреБрднрд╛рд╖рд┐рдпрд╛ ***/
int рдореБрдЦреНрдп(int argc, char **argv, char **env)
{
PERL_SYS_INIT3(&argc,&argv,&env);
my_perl = perl_alloc();
perl_construct(my_perl);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
perl_parse(my_perl, NULL, argc, argv, (char **)NULL);
perl_run(my_perl);
perl_destruct(my_perl);
perl_free(my_perl);
PERL_SYS_TERM();
}
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо "env" рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЖрдо рддреМрд░ рдкрд░ рдЗрд╕рдХреЗ рдЕрдВрддрд┐рдо рдХреЗ рд░реВрдк рдореЗрдВ "perl_parse" рдХреЛ рд╕реМрдВрдк рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рддрд░реНрдХ, рдпрд╣рд╛рдВ "env" рдХреЛ "NULL" рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рд╡реЗрд╢ рдРрд╕рд╛ рдХрд░реЗрдЧрд╛
рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рдореИрдХреНрд░реЛрдЬрд╝ PERL_SYS_INIT3() рдФрд░ PERL_SYS_TERM() рд╕реА рдХрд╛ рд╕рд┐рд╕реНрдЯрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреНрдпреВрди рдЕрдк рдкреНрд░рджрд╛рди рдХрд░реЗрдВ
рдкрд░реНрд▓ рджреБрднрд╛рд╖рд┐рдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд░рдирдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг; рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐ рдЖрдк рдХрд┐рддрдиреЗ рджреБрднрд╛рд╖рд┐рдП рдмрдирд╛рддреЗ рд╣реИрдВ рдпрд╛ рдирд╖реНрдЯ рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдкреБрдХрд╛рд░рдирд╛ PERL_SYS_INIT3() рд╕реЗ рдкрд╣рд▓реЗ
рдЖрдк рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ PERL_SYS_TERM() рдЕрдкрдиреЗ рдЕрдВрддрд┐рдо рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж
рджреБрднрд╛рд╖рд┐рдпрд╛ред
рдЬрдмрд╕реЗ PERL_SYS_INIT3() "env" рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, "env" рдХреЛ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ perl_parse().
рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк рдЪрд╛рд╣реЗ рдЬреЛ рднреА рддрд░реНрдХ рджреЗрдВ perl_parse(), PERL_SYS_INIT3() рдЪрд╛рд╣рд┐рдП
рд╕реА рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП рдореБрдЦреНрдп() argc, argv рдФрд░ env рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ред
рдЕрдм рдЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ (рдореИрдВ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реВрдВрдЧрд╛)ред рдЗрдВрдЯрд░рдкреА.рд╕реА) рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдореЗрдВ:
% cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
рд╕рдлрд▓ рд╕рдВрдХрд▓рди рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВрдЧреЗ рдЗрдВрдЯрд░рдкреЛ рдмрд┐рд▓реНрдХреБрд▓ рдкрд░реНрд▓ рдХреА рддрд░рд╣:
% рдЗрдВрдЯрд░рдк
рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ "рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкрд░реНрд▓\n";
рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ "10890 - 9801 рд╣реИ ", 10890 - 9801;
рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкрд░реНрд▓
10890 - 9801 1089 рд╣реИ
or
% рдЗрдВрдЯрд░рдк -рдИ 'рдкреНрд░рд┐рдВрдЯрдл('%x', 3735928559)'
рдореГрдд рдЧрд╛рдп рдХрд╛ рдорд╛рдВрд╕
рдЖрдк рдЕрдкрдиреЗ рд╕реА рдХреЗ рдмреАрдЪ рдореЗрдВ рд░рд╣рддреЗ рд╣реБрдП рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкрд░реНрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдкрдврд╝ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдкреНрд░реЛрдЧреНрд░рд╛рдо, рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдбрд╛рд▓рдХрд░ рдПрдЖрд░рдЬреАрд╡реА [1] рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ perl_run.
рдХреЙрд▓рд┐рдВрдЧ a рдкрд░реНрд▓ рд╕рдмрд░реВрдЯреАрди рд╕реЗ рддреБрдВрд╣рд╛рд░реЗ C рдХрд╛рд░реНрдпрдХреНрд░рдо
рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд░реНрд▓ рд╕рдмрд░реВрдЯреАрдиреНрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдкреБрдХрд╛рд░рдирд╛_* рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдкрд░реНрд▓рдХреЙрд▓. рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдо "call_argv" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдпрд╣ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЬрд┐рд╕реЗ рдореИрдВ рдХреЙрд▓ рдХрд░реВрдВрдЧрд╛ рд╢реЛрдЯрд╛рдЗрдо.рд╕реА.
#рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛
#рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛
рд╕реНрдерд┐рд░ рдкрд░реНрд▓рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ *my_perl;
int рдореБрдЦреНрдп(int argc, char **argv, char **env)
{
рдЪрд╛рд░ *args[] = {рд╢реВрдиреНрдп };
PERL_SYS_INIT3(&argc,&argv,&env);
my_perl = perl_alloc();
perl_construct(my_perl);
perl_parse(my_perl, NULL, argc, argv, NULL);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
/*** рд╕реНрдХрд┐рдкрд┐рдВрдЧ perl_run() ***/
call_argv("рд╢реЛрдЯрд╛рдЗрдо", G_DISCARD | G_NOARGS, args);
perl_destruct(my_perl);
perl_free(my_perl);
PERL_SYS_TERM();
}
рдЬрд╣рд╛рдВ рд╢реЛрдЯрд╛рдЗрдо рдПрдХ рдкрд░реНрд▓ рд╕рдмрд░реВрдЯреАрди рд╣реИ рдЬреЛ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд▓реЗрддрд╛ (рдпрд╣реА рд╣реИ)ред G_NOARGS) рдФрд░ рдХрд┐рд╕рдХреЗ рд▓рд┐рдП
рдЬрд┐рд╕реЗ рдореИрдВ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛ (рд╡рд╣ рд╣реИ G_рдЫреЛрдбрд╝реЗрдВ). рд╡реЗ рдЭрдВрдбреЗ, рдФрд░ рдЕрдиреНрдп, рд╣реИрдВ
рдкрд░реНрд▓рдХреЙрд▓ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИред
рдореИрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реВрдВрдЧрд╛ рд╢реЛрдЯрд╛рдЗрдо рдирд╛рдордХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдмрд░реВрдЯреАрди showtime.pl:
рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ "рдореБрдЭреЗ рдореБрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛";
рдЙрдк рд╢реЛрдЯрд╛рдЗрдо {
рдореБрджреНрд░рдг рд╕рдордп;
}
рдХрд╛рдлреА рд╕рд░рд▓ред рдЕрдм рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдБ:
% cc -o рд╢реЛрдЯрд╛рдЗрдо showtime.c \
`perl -MExtUtils::Embed -e ccopts -e ldopts`
% рд╢реЛрдЯрд╛рдЗрдо рд╢реЛрдЯрд╛рдЗрдо.pl
818284590
1 рдЬрдирд╡рд░реА 1970 (рд╢реБрд░реБрдЖрдд) рдХреЗ рдмреАрдЪ рдмреАрддреЗ рд╕реЗрдХрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬреНрдЮрд╛рдд рдХрд░рдирд╛
рдпреВрдирд┐рдХреНрд╕ рдпреБрдЧ), рдФрд░ рдЬрд┐рд╕ рдХреНрд╖рдг рдореИрдВрдиреЗ рдпрд╣ рд╡рд╛рдХреНрдп рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред
рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ perl_run, рдЬреИрд╕реЗ рд╣реА рд╣рдо PL_exit_flag рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ
PERL_EXIT_DESTRUCT_END рдЬреЛ perl_destruct рдореЗрдВ END рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдкрд░реНрд▓ рд╕рдмрд░реВрдЯреАрди рдореЗрдВ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ
"рд╢реВрдиреНрдп"-рд╕рдорд╛рдкреНрдд "рдЖрд░реНрдЧреНрд╕" рд╕реВрдЪреА рдХреЛ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЙрд▓_argv. рдЕрдиреНрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдорд╛рди рд▓реМрдЯрд╛рдПрдБ, рдЖрдкрдХреЛ рдкрд░реНрд▓ рд╕реНрдЯреИрдХ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ "рдлрд┐рдбрд▓рд┐рдВрдЧ" рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдЖрдкрдХреЗ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдкрд░реНрд▓ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде"ред
рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди a рдкрд░реНрд▓ рдХрдерди рд╕реЗ рддреБрдВрд╣рд╛рд░реЗ C рдХрд╛рд░реНрдпрдХреНрд░рдо
рдкрд░реНрд▓, рдкрд░реНрд▓ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдПрдкреАрдЖрдИ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпреЗ "eval_sv" рдореЗрдВ рд╣реИрдВ
рдкреЗрд░рд▓рд╛рдкреА рдФрд░ рдкреЗрд░рд▓рд╛рдкреА рдореЗрдВ "eval_pv"ред
рдпрдХреАрдирди, рдпреЗ рдПрдХрдорд╛рддреНрд░ рд░реВрдЯреАрди рд╣реИрдВ рдЬрд┐рдирдХреА рдЖрдкрдХреЛ рдкрд░реНрд▓ рдХреЛрдб рдХреЗ рд╕реНрдирд┐рдкреЗрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА
рдЖрдкрдХреЗ C рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рднреАрддрд░ рд╕реЗред рдЖрдкрдХрд╛ рдХреЛрдб рдЬрдм рддрдХ рдЖрдк рдЪрд╛рд╣реЗрдВ рддрдм рддрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; рдЗрд╕рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ
рдХрдерди; рдпрд╣ perlfunc рдореЗрдВ "рдЙрдкрдпреЛрдЧ", perlfunc рдореЗрдВ "рдЖрд╡рд╢реНрдпрдХрддрд╛" рдФрд░ perlfunc рдореЗрдВ "рдХрд░рдирд╛" рдирд┐рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдмрд╛рд╣рд░реА рдкрд░реНрд▓ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
eval_pv рдЖрдЗрдП рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░реНрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЬрдмрд░рджрд╕реНрддреА рдХреЗ рд▓рд┐рдП рд╡реЗрд░рд┐рдПрдмрд▓ рдирд┐рдХрд╛рд▓реЗрдВ
рд╕реА рдкреНрд░рдХрд╛рд░ рдореЗрдВ. рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо, рд╕реНрдЯреНрд░рд┐рдВрдЧ.рд╕реА, рддреАрди рдкрд░реНрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ
рдкрд╣рд▓реЗ рд╕реЗ "int", рджреВрд╕рд░реЗ рд╕реЗ "рдлреНрд▓реЛрдЯ", рдФрд░ рддреАрд╕рд░реЗ рд╕реЗ "char*"ред
#рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛
#рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛
рд╕реНрдерд┐рд░ рдкрд░реНрд▓рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ *my_perl;
рдореБрдЦреНрдп (int argc, char **argv, char **env)
{
рдЪрд╛рд░ *рдПрдореНрдмреЗрдбрд┐рдВрдЧ[] = { "", "-рдИ", "0" };
PERL_SYS_INIT3(&argc,&argv,&env);
my_perl = perl_alloc();
perl_construct(my_perl);
perl_parse(my_perl, NULL, 3, рдПрдореНрдмреЗрдбрд┐рдВрдЧ, NULL);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
perl_run(my_perl);
/** $a рдХреЛ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рдиреЗрдВ **/
eval_pv("$a = 3; $a **= 2", TRUE);
printf('a = %d\n', SvIV(get_sv('a', 0)));
/** $a рдХреЛ рдПрдХ рдлреНрд▓реЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреЗрдВ **/
eval_pv("$a = 3.14; $a **= 2", TRUE);
printf('a = %f\n', SvNV(get_sv('a', 0)));
/** $a рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреЗрдВ **/
eval_pv(
"$a = 'rekcaH lreP rehtonA tsuJ'; $a = рдЙрд▓рдЯрд╛($a);", TRUE);
printf("a = %s\n", SvPV_nolen(get_sv("a", 0)));
perl_destruct(my_perl);
perl_free(my_perl);
PERL_SYS_TERM();
}
рдЙрди рд╕рднреА рдЕрдЬреАрдм рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде sv рдЙрдирдХреЗ рдирд╛рдо рдкрд░реНрд▓ рд╕реНрдХреЗрд▓рд░ рдХреЛ C рдореЗрдВ рдмрджрд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ
рдкреНрд░рдХрд╛рд░. рдЙрдирдХрд╛ рд╡рд░реНрдгрди рдкрд░реНрд▓рдЧреБрдЯреНрд╕ рдФрд░ рдкрд░реНрд▓рдкреА рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ.рд╕реА, рдЖрдк рдЙрдкрдпреЛрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВрдЧреЗ рдПрд╕рд╡реАрдЖрдИрд╡реА() рдПрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
"рдЗрдВрдЯ", рдПрд╕рд╡реАрдПрдирд╡реА() рдПрдХ "рдлреНрд▓реЛрдЯ" рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдПрд╕рд╡реАрдкреАрд╡реА () рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП:
рдПрдХ = 9
рдПрдХ = 9.859600
рдП = рдмрд╕ рдПрдХ рдФрд░ рдкрд░реНрд▓ рд╣реИрдХрд░
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдЧрдгрдирд╛ рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдмрдирд╛рдпрд╛ рд╣реИ
рд╣рдорд╛рд░реА рдореВрд▓реНрдпрд╛рдВрдХрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпред рдпрд╣ рд╕рдВрднрд╡ рднреА рд╣реИ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдПрдХ рдмреЗрд╣рддрд░ рд░рдгрдиреАрддрд┐ рднреА рд╣реИ
рд╕реЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП eval_pv() рдмрдЬрд╛рдпред рдЙрджрд╛рд╣рд░рдг:
...
рдПрд╕рд╡реА * рд╡реИрд▓ = eval_pv ("рд░рд┐рд╡рд░реНрд╕ 'rekcaH lreP rehtonA tsuJ'", TRUE);
рдкреНрд░рд┐рдВрдЯрдл ("%s\n", SvPV_nolen(val));
...
рдЗрд╕ рддрд░рд╣, рд╣рдо рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рди рдмрдирд╛рдХрд░ рдирд╛рдорд╕реНрдерд╛рди рдкреНрд░рджреВрд╖рдг рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ рдФрд░ рд╣рдордиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ рднреА рд╣реИ
рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рднреА рд╕рд░рд▓ рдмрдирд╛рдпрд╛ред
рдкреНрд░рджрд░реНрд╢рди рдкрд░реНрд▓ рдкреИрдЯрд░реНрди рдореИрдЪ рдФрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕реЗ рддреБрдВрд╣рд╛рд░реЗ C рдХрд╛рд░реНрдпрдХреНрд░рдо
RSI eval_sv() рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрдВ рдкрд░реНрд▓ рдХреЛрдб рдХреА рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╣рдо рдХреБрдЫ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХреЗрдВ
рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд┐рд▓рд╛рди рдФрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдореЗрдВ "рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛" рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ: рдорд┐рд▓рд╛рди(), рд╡рд┐рдХрд▓реНрдк(),
рдФрд░ рдорд┐рд▓рд╛рди().
I32 рдореИрдЪ (рдПрд╕рд╡реА *рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЪрд╛рд░ *рдкреИрдЯрд░реНрди);
рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рдПрдХ рдкреИрдЯрд░реНрди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "m/clasp/" рдпрд╛ "/\b\w*\b/", рдЬреЛ рдЖрдкрдХреЗ C рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╣реИ
"/\\b\\w*\\b/") рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдорд┐рд▓рд╛рди() рдпрджрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ рддреЛ 1 рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ 0 рд▓реМрдЯрд╛рддрд╛ рд╣реИ
рдЕрдиреНрдпрдерд╛ред
рдкреВрд░реНрдгрд╛рдВрдХ рд╕реНрдерд╛рдирд╛рдкрдиреНрди (рдПрд╕рд╡реА **рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЪрд╛рд░ *рдкреИрдЯрд░реНрди);
рдПрдХ "рдПрд╕рд╡реА" рдФрд░ рдПрдХ "=~" рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдПрд╕/рдмреЙрдм/рд░реЙрдмрд░реНрдЯ/рдЬреА" рдпрд╛
"tr[AZ][az]"), рд╡рд┐рдХрд▓реНрдк() рдХреЗ рдЕрдиреБрд╕рд╛рд░ "рдПрд╕рд╡реА" рдХреЗ рднреАрддрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ
рдСрдкрд░реЗрд╢рди, рдХрд┐рдП рдЧрдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
SSize_t рдорд┐рд▓рд╛рди (рдПрд╕рд╡реА *рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЪрд╛рд░ *рдкреИрдЯрд░реНрди, рдПрд╡реА **рдорд┐рд▓рд╛рди);
рдПрдХ "рдПрд╕рд╡реА", рдПрдХ рдкреИрдЯрд░реНрди, рдФрд░ рдПрдХ рдЦрд╛рд▓реА "рдПрд╡реА" рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдорд┐рд▓рд╛рди() "$рд╕реНрдЯреНрд░рд┐рдВрдЧ =~" рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ
$рдкреИрдЯрд░реНрди" рдПрдХ рд╕реВрдЪреА рд╕рдВрджрд░реНрдн рдореЗрдВ, рдФрд░ рднрд░рддрд╛ рд╣реИ рдореИрдЪ рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде, рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛
рдкрд╛рдП рдЧрдП рдорд┐рд▓рд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛.
рдпрд╣рд╛рдБ рдПрдХ рдирдореВрдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ, рдореИрдЪ.рд╕реА, рдЬреЛ рддреАрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рд▓рдВрдмреА рд▓рд╛рдЗрдиреЗрдВ рдпрд╣рд╛рдВ рд▓рдкреЗрдЯреА рдЧрдИ рд╣реИрдВ):
#рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛
#рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛
рд╕реНрдерд┐рд░ рдкрд░реНрд▓рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ *my_perl;
/** my_eval_sv(рдХреЛрдб, error_check)
** рдХреБрдЫ-рдХреБрдЫ eval_sv() рдЬреИрд╕рд╛,
** рд▓реЗрдХрд┐рди рд╣рдо рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рд╕реНрдЯреИрдХ рд╕реЗ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ
** /
SV* my_eval_sv(SV *sv, I32 croak_on_error)
{
рдбреАрдПрд╕рдкреА;
рдПрд╕рд╡реА* рд░реЗрдЯрд╡рд▓;
рдкреБрд╢рдорд╛рд░реНрдХ (рдПрд╕рдкреА);
eval_sv(sv, G_SCALAR);
рд╕реНрдкреЗрди;
рд░реЗрдЯрд╡рд▓ = рдкреАрдУрдкреА;
рд╡рд╛рдкрд╕ рд░рдЦреЛ;
рдпрджрд┐ (croak_on_error && SvTRUE(ERRSV))
рдХреНрд░реЛрдХ(SvPVx_nolen(ERRSV));
рд╡рд╛рдкрд╕реА рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐;
}
/** рдорд┐рд▓рд╛рди (рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдкреИрдЯрд░реНрди)
**
** рдЕрджрд┐рд╢ рд╕рдВрджрд░реНрдн рдореЗрдВ рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
**
** рдпрджрд┐ рдореИрдЪ рд╕рдлрд▓ рд░рд╣рд╛ рддреЛ 1 рд▓реМрдЯрд╛рддрд╛ рд╣реИ; 0 рдЕрдиреНрдпрдерд╛.
** /
I32 рдореИрдЪ (рдПрд╕рд╡реА *рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЪрд╛рд░ *рдкреИрдЯрд░реНрди)
{
рдПрд╕рд╡реА *рдХрдорд╛рдВрдб = рдиреНрдпреВрдПрд╕рд╡реА(0), *рд░рд┐рдЯрд╡рд▓;
sv_setpvf(рдХрдорд╛рдВрдб, "рдореЗрд░реА $рд╕реНрдЯреНрд░рд┐рдВрдЧ = '%s'; $рд╕реНрдЯреНрд░рд┐рдВрдЧ =~ %s",
SvPV_nolen(рд╕реНрдЯреНрд░рд┐рдВрдЧ), рдкреИрдЯрд░реНрди);
рд░реЗрдЯрд╡рд▓ = my_eval_sv(рдХрдорд╛рдВрдб, TRUE);
SvREFCNT_dec(рдХрдорд╛рдВрдб);
рд╡рд╛рдкрд╕реА SvIV(рд░рд┐рдЯрд╡рд▓);
}
/** рд╕реНрдерд╛рдирд╛рдкрдиреНрди(рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдкреИрдЯрд░реНрди)
**
** =~ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
** рдЙрдирдХреЗ рдмрд╛рдПрдБ рд╣рд╛рде рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ (s /// рдФрд░ tr ///)
**
** рд╕рдлрд▓ рдореИрдЪреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░
** рдпрджрд┐ рдХреЛрдИ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛ рддреЛ рдЙрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
** /
I32 рд╕реНрдерд╛рдирд╛рдкрдиреНрди (рдПрд╕рд╡реА **рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЪрд╛рд░ *рдкреИрдЯрд░реНрди)
{
рдПрд╕рд╡реА *рдХрдорд╛рдВрдб = рдиреНрдпреВрдПрд╕рд╡реА(0), *рд░рд┐рдЯрд╡рд▓;
sv_setpvf(рдХрдорд╛рдВрдб, "$рд╕реНрдЯреНрд░рд┐рдВрдЧ = '%s'; ($рд╕реНрдЯреНрд░рд┐рдВрдЧ =~ %s)",
SvPV_nolen(*string), рдкреИрдЯрд░реНрди);
рд░реЗрдЯрд╡рд▓ = my_eval_sv(рдХрдорд╛рдВрдб, TRUE);
SvREFCNT_dec(рдХрдорд╛рдВрдб);
*рд╕реНрдЯреНрд░рд┐рдВрдЧ = get_sv("рд╕реНрдЯреНрд░рд┐рдВрдЧ", 0);
рд╡рд╛рдкрд╕реА SvIV(рд░рд┐рдЯрд╡рд▓);
}
/** рдорд┐рд▓рд╛рди (рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдкреИрдЯрд░реНрди, рдорд┐рд▓рд╛рди)
**
** рд╕реВрдЪреА рд╕рдВрджрд░реНрдн рдореЗрдВ рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
**
** рдорд┐рд▓рд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ,
** рдФрд░ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдмрд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде ** рдорд┐рд▓рд╛рди рднрд░рддрд╛ рд╣реИ
** /
SSize_t рдорд┐рд▓рд╛рди (рдПрд╕рд╡реА *рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЪрд╛рд░ *рдкреИрдЯрд░реНрди, рдПрд╡реА **рдореИрдЪ_рд▓рд┐рд╕реНрдЯ)
{
рдПрд╕рд╡реА *рдХрдорд╛рдВрдб = рдиреНрдпреВрдПрд╕рд╡реА; (0)
SSize_t num_matches;
sv_setpvf(рдХрдорд╛рдВрдб, "рдореЗрд░реА $рд╕реНрдЯреНрд░рд┐рдВрдЧ = '%s'; @array = ($рд╕реНрдЯреНрд░рд┐рдВрдЧ =~ %s)",
SvPV_nolen(рд╕реНрдЯреНрд░рд┐рдВрдЧ), рдкреИрдЯрд░реНрди);
my_eval_sv(рдХрдорд╛рдВрдб, рд╕рддреНрдп);
SvREFCNT_dec(рдХрдорд╛рдВрдб);
*рдореИрдЪ_рд▓рд┐рд╕реНрдЯ = get_av('рд╕рд░рдгреА', 0);
num_matches = av_top_index(*match_list) + 1;
рд╡рд╛рдкрд╕реА num_matches;
}
рдореБрдЦреНрдп (int argc, char **argv, char **env)
{
рдЪрд╛рд░ *рдПрдореНрдмреЗрдбрд┐рдВрдЧ[] = { "", "-рдИ", "0" };
рдПрд╡реА *рдореИрдЪ_рд▓рд┐рд╕реНрдЯ;
I32 num_matches, i;
рдПрд╕рд╡реА *рдкрд╛рда;
PERL_SYS_INIT3(&argc,&argv,&env);
my_perl = perl_alloc();
perl_construct(my_perl);
perl_parse(my_perl, NULL, 3, рдПрдореНрдмреЗрдбрд┐рдВрдЧ, NULL);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
рдкрд╛рда = рдиреНрдпреВрдПрд╕рд╡реА; (0)
sv_setpv(рдкрд╛рда, "рдЬрдм рд╡рд╣ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд╕реНрдЯреЛрд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ "
"рдмрд┐рд▓ 76 рд╕реЗрдВрдЯ рдЬреИрд╕реА рдХреБрдЫ рд░рд╛рд╢рд┐ рдХрд╛ рдЖрддрд╛ рд╣реИ, рдореЗрдирд╛рд░реНрдб рд╣реИ"
"рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЙрд╕реЗ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреБрдЫ"
"рдЗрд╕рд╕реЗ рд╡рд╣ рдПрдХ рдЪреМрдерд╛рдИ рд╡рд╛рдкрд╕ рдкрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдкрд╛рд╕ рд╣реИ"
"рдкрддрд╛ рдирд╣реАрдВ *рдХреНрдпрд╛*ред рд╡рд╣ рдЕрдкрдиреА рд▓рд╛рд▓ рдирд┐рдЪреЛрдбрд╝ рдХреЛ рдЯрдЯреЛрд▓рддрд╛ рд╣реИ"
"рдкрд░реНрд╕ рдмрджрд▓реЗрдВ рдФрд░ рд▓рдбрд╝рдХреЗ рдХреЛ рддреАрди рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд╕реЗ рджреЗрдВ"
"рдЙрд╕рдХрд╛ рдбреЙрд▓рд░, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдЙрд╕рдХреА рдХрд┐рд╕реНрдордд рд╕рд╣реА рд╣реЛ рдЬрд╛рдП"
"рд░рд╛рд╢рд┐ред рд▓рдбрд╝рдХрд╛ рдЙрд╕реЗ рдЕрдкрдиреЗ рджреЛ рдкреИрд╕реЗ рд╡рд╛рдкрд╕ рджреЗрддрд╛ рд╣реИ"
"рдФрд░ рдлрд┐рд░ рдмрдбрд╝рд╛ рдЪрдордХрджрд╛рд░ рдХреНрд╡рд╛рд░реНрдЯрд░ рдЬреЛ рдЙрд╕рдХрд╛ рдкреБрд░рд╕реНрдХрд╛рд░ рд╣реИред"
"-рд░рд┐рдЪ");
рдпрджрд┐ (рдорд┐рд▓рд╛рди(рдЯреЗрдХреНрд╕реНрдЯ, "рдПрдо/рдХреНрд╡рд╛рд░реНрдЯрд░/")) /** рдХреНрдпрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ 'рдХреНрд╡рд╛рд░реНрдЯрд░' рд╢рд╛рдорд┐рд▓ рд╣реИ? **/
рдкреНрд░рд┐рдВрдЯрдл ("рдорд┐рд▓рд╛рди: рдкрд╛рда рдореЗрдВ 'рдХреНрд╡рд╛рд░реНрдЯрд░' рд╢рдмреНрдж рд╣реИред\n\n");
рдЕрдиреНрдп
рдкреНрд░рд┐рдВрдЯрдл ("рдорд┐рд▓рд╛рди: рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ 'рдХреНрд╡рд╛рд░реНрдЯрд░' рд╢рдмреНрдж рдирд╣реАрдВ рд╣реИред\n\n");
рдпрджрд┐ (рдорд┐рд▓рд╛рди(рдкрд╛рда, "рдПрдо/рдЖрдард╡рд╛рдВ/")) /** рдХреНрдпрд╛ рдкрд╛рда рдореЗрдВ 'рдЖрдард╡рд╛рдВ' рд╣реИ? **/
рдкреНрд░рд┐рдВрдЯрдл ("рдорд┐рд▓рд╛рди: рдкрд╛рда рдореЗрдВ 'рдЖрдард╡рд╛рдВ' рд╢рдмреНрдж рд╣реИред\n\n");
рдЕрдиреНрдп
рдкреНрд░рд┐рдВрдЯрдл ("рдорд┐рд▓рд╛рди: рдкрд╛рда рдореЗрдВ 'рдЖрдард╡рд╛рдВ' рд╢рдмреНрдж рдирд╣реАрдВ рд╣реИред\n\n");
/** /wi../ рдХреА рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдорд┐рд▓рд╛рди рдХрд░реЗрдВ **/
num_matches = рдорд┐рд▓рд╛рди(рдкрд╛рда, "m/(wi..)/g", &match_list);
рдкреНрд░рд┐рдВрдЯрдл ("рдорд┐рд▓рд╛рди: m/(wi..)/g %d рдорд┐рд▓рд╛рди рдорд┐рд▓рд╛...\n", num_matches);
(i = 0; i < num_matches; i++) рдХреЗ рд▓рд┐рдП
рдкреНрд░рд┐рдВрдЯрдл ("рдорд┐рд▓рд╛рди: %s\n",
SvPV_nolen(*av_fetch(match_list, i, FALSE)));
рдкреНрд░рд┐рдВрдЯрдлрд╝('\n');
/**рдкрд╛рда рд╕реЗ рд╕рднреА рд╕реНрд╡рд░ рд╣рдЯрд╛ рджреЗрдВ**/
num_matches = рд╕реНрдерд╛рдирд╛рдкрдиреНрди(&text, "s/[aeiou]//gi");
рдпрджрд┐ (num_matches) {
рдкреНрд░рд┐рдВрдЯрдл("рд╡рд┐рдХрд▓реНрдк: s/[aeiou]//gi...%lu рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд┐рдпрд╛ рдЧрдпрд╛ред\n",
(рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмрд╛)num_matches);
рдкреНрд░рд┐рдВрдЯрдл ("рдЕрдм рдкрд╛рда рд╣реИ: %s\n\n", SvPV_nolen(рдкрд╛рда));
}
/** рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ **/
рдпрджрд┐ (!рд╡рд┐рдХрд▓реНрдк(&text, "s/Perl/C/")) {
рдкреНрд░рд┐рдВрдЯрдл ("рд╡рд┐рдХрд▓реНрдк: s/Perl/C...рдХреЛрдИ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред\n\n");
}
SvREFCNT_dec(рдкрд╛рда);
PL_perl_destruct_level = 1;
perl_destruct(my_perl);
perl_free(my_perl);
PERL_SYS_TERM();
}
рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ (рдлрд┐рд░ рд╕реЗ, рдпрд╣рд╛рдВ рд▓рдВрдмреА рд▓рд╛рдЗрдиреЗрдВ рд▓рдкреЗрдЯреА рдЧрдИ рд╣реИрдВ)
рдорд┐рд▓рд╛рди: рдкрд╛рда рдореЗрдВ 'рдХреНрд╡рд╛рд░реНрдЯрд░' рд╢рдмреНрдж рд╣реИред
рдорд┐рд▓рд╛рди: рдкрд╛рда рдореЗрдВ 'рдЖрдард╡рд╛рдВ' рд╢рдмреНрдж рдирд╣реАрдВ рд╣реИред
рдорд┐рд▓рд╛рди: m/(wi..)/g 2 рдорд┐рд▓рд╛рди рдорд┐рд▓реЗ...
рдореИрдЪ: рд╣реЛрдЧрд╛
рдХреЗ рд╕рд╛рде рдореЗрд▓
рд╕реНрдерд╛рдирд╛рдкрдиреНрди: s/[aeiou]//gi...139 рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд┐рдП рдЧрдПред
рдЕрдм рдкрд╛рда рд╣реИ: рдбрдмреНрд▓реВрдПрдЪрдПрди рдПрдЪрдПрд╕рдЯреА рд╕реАрдПрдирд╡реАрдПрдирд╕реА рдПрд╕рдЯреА рдПрдирдбреА рд╡реЗрдВ рдмреАрдПрд▓рдПрд▓ рд╕реАрдПрдордПрд╕ рдЯреА рдПрд╕рдПрдо рдПрдордПрдирдЯреА рдПрд▓рдХреЗ 76 рд╕реАрдПрдирдЯреА,
Mynrd s wr tht thr s smthng h *shld* d, smthng tht wll nbl hm t gt
bck qrtr, bt h hs nd *wht*ред рдПрдЪ рдПрдлрдПрдордмреАрдПрд▓ рдереНрд░реВ рдПрдЪрдПрд╕ рдЖрд░рдбреА рдПрд╕рдХреНрдпреВрдЬреА рд╕реАрдПрдирдЬреАрдкреАрдЖрд░ рдПрдирдбреА
gvs th рдмрд╛рдп thr xtr pnns wth HS dllr, hpng tht h mght lck nt th crrct
mnt. рд╡реЗрдВ рджреНрд╡рд╛рд░рд╛ gvs рдПрдЪрдПрдо bck tw f рдПрдЪрдПрд╕ wn pnns nd thn th bg shny qrtr tht s
рдПрдЪрдПрд╕ рдкреАрдЖрд░рдЬреЗрдб. -рдЖрд░рд╕реАрдПрдЪрдПрдЪ
рд╕реНрдерд╛рдирд╛рдкрдиреНрди: s/Perl/C...рдХреЛрдИ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рдирд┐рд░рд░реНрдердХ рд╕рд╛рде рдореЗрдВ la рдкрд░реНрд▓ рдзреБрдЖрдБрд░рд╛ рд╕реЗ рддреБрдВрд╣рд╛рд░реЗ C рдХрд╛рд░реНрдпрдХреНрд░рдо
рд╕реНрдЯреИрдХ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп, рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХреЗрдВ рдХреБрдЫ рди рдХреБрдЫ рдмреБрджрдмреБрджрд╛рддреА рд╣реИрдВ
рдХреИрдлреЗрдЯреЗрд░рд┐рдпрд╛ рдкреНрд▓реЗрдЯреЛрдВ рдХреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ-рд▓реЛрдбреЗрдб рдХреЙрд▓рдо: рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓рд╛ рд╣реИ
рдкрд╣рд▓реА рдмрд╛рдд рддреЛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВред рдпрд╣ рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛: рдЖрдкрдХрд╛ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреБрдЫ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдПрдЧрд╛
"рдкрд░реНрд▓ рд╕реНрдЯреИрдХ" рдкрд░ рддрд░реНрдХ, рдХреБрдЫ рдЬрд╛рджреВ рд╣реЛрдиреЗ рдкрд░ рдЕрдкрдиреА рдЖрдБрдЦреЗрдВ рдмрдВрдж рдХрд░ рд▓реЗрдВ, рдФрд░ рдлрд┐рд░ рдкреЙрдк рдХрд░реЗрдВ
рдкрд░рд┐рдгрд╛рдо--рдЖрдкрдХреЗ рдкрд░реНрд▓ рд╕рдмрд░реВрдЯреАрди рдХрд╛ рд░рд┐рдЯрд░реНрди рдорд╛рди--рд╕реНрдЯреИрдХ рд╕реЗ рдмрд╛рд╣рд░ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ C рдкреНрд░рдХрд╛рд░ рдФрд░ рдкрд░реНрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреАрдЪ рдХреИрд╕реЗ рдХрдирд╡рд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП newSViv()
рдФрд░ sv_setnv() рдФрд░ рдирдпрд╛рдПрд╡реА() рдФрд░ рдЙрдирдХреЗ рд╕рднреА рджреЛрд╕реНрдд. рдЙрдирдХрд╛ рд╡рд░реНрдгрди рдкрд░реНрд▓рдЧрдЯреНрд╕ рдФрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
perlapi.
рдлрд┐рд░ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд░реНрд▓ рд╕реНрдЯреИрдХ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХреИрд╕реЗ рдХрд░реЗрдВред рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдкрд░реНрд▓рдХреЙрд▓ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕рдордЭ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдкрд░реНрд▓ рдХреЛ рд╕реА рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдХреНрдпреЛрдВрдХрд┐ C рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рдШрд╛рддрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рдЖрдЗрдП рдкрд░реНрд▓ рдмрдирд╛рдПрдВ **
рдСрдкрд░реЗрдЯрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ (рдпрд╣ рдЬрд┐рддрдирд╛ рд▓рдЧрддрд╛ рд╣реИ рдЙрд╕рд╕реЗ рдХрдо рдЙрдкрдпреЛрдЧреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░реНрд▓ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ **
рд╕реА рдХреЗ рд╕рд╛рде рдкрд╛рдЙ () рд╕рдорд╛рд░реЛрд╣)ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдПрдХ рд╕реНрдЯрдм рдПрдХреНрд╕рдкреЛрдиреЗрдВрдЯрд┐рдПрд╢рди рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдКрдВрдЧрд╛ рдкрд╛рд╡рд░.рдкреАрдПрд▓:
рд╕рдм рдПрдХреНрд╕рдкреЛ {
рдореЗрд░рд╛ ($a, $b) = @_;
рд╡рд╛рдкрд╕реА $a ** $b;
}
рдЕрдм рдореИрдВ рдПрдХ C рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдКрдВрдЧрд╛, рдкреЙрд╡рд░.рд╕реА, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкрд░реНрд▓рдкрд╛рд╡рд░() рдЬрд┐рд╕рдореЗрдВ рд╕рдм рдХреБрдЫ рд╢рд╛рдорд┐рд▓ рд╣реИ
рджреЛ рддрд░реНрдХреЛрдВ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд░реВрд░реА рд╣реИ рдПрдХреНрд╕рдкреЛ() рдФрд░ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдкреЙрдк рдЖрдЙрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЧрд╣рд░реА рд╕рд╛рдБрд╕ рд▓реЗрдирд╛...
#рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛
#рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛
рд╕реНрдерд┐рд░ рдкрд░реНрд▓рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ *my_perl;
рд╕реНрдерд┐рд░ рд╢реВрдиреНрдп
рдкрд░реНрд▓рдкрд╛рд╡рд░(int a, int b)
{
рдбреАрдПрд╕рдкреА; /* рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ */
рдкреНрд░рд╡реЗрд╢ рдХрд░рдирд╛; /*рдпрд╣рд╛рдБ рдХреЗ рдмрд╛рдж рдмрдирд╛рдИ рдЧрдИ рд╣рд░ рдЪреАрдЬрд╝*/
SAVETMPS; /* ...рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рд╣реИ. */
рдкреБрд╢рдорд╛рд░реНрдХ (рдПрд╕рдкреА); /* рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░ рдпрд╛рдж рд░рдЦреЗрдВ */
XPUSHs(sv_2mortal(newSViv(a))); /* рдЖрдзрд╛рд░ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓реЗрдВ */
XPUSHs(sv_2mortal(newSViv(b))); /* рдШрд╛рддрд╛рдВрдХ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓реЗрдВ */
рдкрд╣рд▓реА рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд▓рд╛рдирд╛; /* рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдмрдирд╛рдПрдВ */
call_pv('рдПрдХреНрд╕рдкреЛ', G_SCALAR); /* рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ */
рд╕реНрдкреИрдЧреИрди; /* рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░ рддрд╛рдЬрд╝рд╛ рдХрд░реЗрдВ */
/* рд╕реНрдЯреИрдХ рд╕реЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдкреЙрдк рдХрд░реЗрдВ */
рдкреНрд░рд┐рдВрдЯрдлрд╝ ("%d рд╕реЗ %dth рдкрд╛рд╡рд░ %d рд╣реИ.\n", a, b, POPi);
рд╡рд╛рдкрд╕ рд░рдЦреЛ;
рдлреНрд░реАрдЯреАрдПрдордкреАрдПрд╕; /* рд╡рд╣ рд╡рд╛рдкрд╕реА рдорд╛рди рдореБрдлрд╝реНрдд рд╣реИ */
рдЫреБрдЯреНрдЯреА; /* ...рдФрд░ XPUSHed "рдирд╢реНрд╡рд░" рддрд░реНрдХред*/
}
рдкреВрд░реНрдгрд╛рдВрдХ рдореБрдЦреНрдп (int argc, char **argv, char **env)
{
рдЪрд╛рд░ *my_argv[] = { "", "power.pl" };
PERL_SYS_INIT3(&argc,&argv,&env);
my_perl = perl_alloc();
perl_construct(my_perl);
perl_parse(my_perl, NULL, 2, my_argv, (char **)NULL);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
perl_run(my_perl);
рдкрд░реНрд▓рдкрд╛рд╡рд░(3); /*** рдЧрдгрдирд╛ 4 ** 3 ***/
perl_destruct(my_perl);
perl_free(my_perl);
PERL_SYS_TERM();
}
рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ:
% cc -o рдкреЙрд╡рд░ рдкреЙрд╡рд░.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
% рд╢рдХреНрддрд┐
3 рд╕реЗ 4рдереА рдШрд╛рдд 81 рд╣реИред
рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ a рджреГрдврд╝ рджреБрднрд╛рд╖рд┐рдпрд╛
рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдФрд░/рдпрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ
рдПрдХ рдирдпрд╛ рдЖрд╡рдВрдЯрди рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рддрдд рджреБрднрд╛рд╖рд┐рдпрд╛ рдмрдирд╛рдП рд░рдЦрдирд╛
рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрдИ рдмрд╛рд░ред рдореБрдЦреНрдп рдХрд╛рд░рдг рдЧрддрд┐ рд╣реИ: рдЪреВрдВрдХрд┐ рдкрд░реНрд▓ рдХреЗрд╡рд▓ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рдПрдХ рдмрд╛рд░ рд╕реНрдореГрддрд┐ рдореЗрдВ.
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХреЛ a рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдиреЗрдорд╕реНрдкреЗрд╕ рдФрд░ рд╡реЗрд░рд┐рдПрдмрд▓ рд╕реНрдХреЛрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕рддрд░реНрдХ рд░рд╣рдирд╛ рд╣реЛрдЧрд╛
рд▓рдЧрд╛рддрд╛рд░ рджреБрднрд╛рд╖рд┐рдпрд╛. рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╣рдо рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрдХреЗрдЬ "рдореБрдЦреНрдп"ред рд╣рдореЗрдВ рдареАрдХ-рдареАрдХ рдкрддрд╛ рдерд╛ рдХрд┐ рдХреМрди рд╕рд╛ рдХреЛрдб рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдорд╛рди рд▓рд┐рдпрд╛ рдХрд┐ рд╣рдо рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдЯрдХрд░рд╛рд╡реЛрдВ рдФрд░ рдЕрдкрдорд╛рдирдЬрдирдХ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рд╡реГрджреНрдзрд┐ рд╕реЗ рдмрдЪреЗрдВред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ рд╕рд░реНрд╡рд░ рд╣реИ рдЬреЛ рдХрднреА-рдХрднреА рдХреБрдЫ рд╕реЗ рдкрд░реНрд▓ рдХреЛрдб рдЪрд▓рд╛рдПрдЧрд╛
рдордирдорд╛рдиреА рдлрд╝рд╛рдЗрд▓. рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдХреЗ рдкрд╛рд╕ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣ рдХреМрди рд╕рд╛ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдмрд╣реБрдд
рдЦрддрд░рдирд╛рдХред
рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ "perl_parse()" рджреНрд╡рд╛рд░рд╛ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдирд╡рдирд┐рд░реНрдорд┐рдд рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ,
рдФрд░ рдмрд╛рдж рдореЗрдВ "perl_destruct()" рд╕реЗ рд╕рд╛рдлрд╝ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдк рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ
рдирд╛рдорд╕реНрдерд╛рди рд╕рдВрдмрдВрдзреА рдкрд░реЗрд╢рд╛рдирд┐рдпрд╛рдБ.
рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдиреЗрдорд╕реНрдкреЗрд╕ рдЯрдХрд░рд╛рд╡ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╣реИ
рдЧрд╛рд░рдВрдЯреАрдХреГрдд-рдЕрджреНрд╡рд┐рддреАрдп рдкреИрдХреЗрдЬ рдирд╛рдо, рдФрд░ рдлрд┐рд░ "eval" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕ рдкреИрдХреЗрдЬ рдореЗрдВ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ
рдкрд░реНрд▓рдлрдВрдХ рдореЗрдВ. рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕рдВрдХрд▓рд┐рдд рдХреА рдЬрд╛рдПрдЧреАред рдпрд╛
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЙрд╕рд╕реЗ рд╕рдВрдмрджреНрдз рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рдЪреБрди рд╕рдХрддрд╛ рд╣реИ
рдЕрдм рдЬрд░реВрд░рдд рдирд╣реАрдВред рдкреЗрд░рд▓рд╛рдкреА рдореЗрдВ "call_argv" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╕рдмрд░реВрдЯреАрди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ
"рдПрдореНрдмреЗрдб::рдкрд░реНрд╕рд┐рд╕реНрдЯреЗрдВрдЯ::eval_file" рдЬреЛ рдлрд╝рд╛рдЗрд▓ "persistent.pl" рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ
рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдФрд░ рдмреВрд▓рд┐рдпрди рдХреНрд▓реАрдирдЕрдк/рдХреИрд╢ рдлрд╝реНрд▓реИрдЧред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдмрдврд╝рддреА рд░рд╣реЗрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
"рдСрдЯреЛрд▓реЛрдб" рд╡рд╛рд▓реЗ рд╕рдмрд░реВрдЯреАрдиреНрд╕ рдФрд░ рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдкрд░реНрд▓ рдХреЗ рдкреНрд░рддреАрдХ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИрдВ
рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдмрд▓. рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреБрдЫ рддрд░реНрдХ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реЗрдВ рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрддрд╛ рд╣реЛ, рдпрд╛
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рд╣реЛ, рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рдж рд╕реНрд╡рдпрдВ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ
рдиреНрдпреВрдирддрдо рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЖрдк рдЬрдм рднреА perlfunc рдореЗрдВ рдЕрдкрдиреЗ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЛ "my" рдХреЗ рд╕рд╛рде рд╕реНрдХреЛрдк рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ
рд╕рдВрднрд╡.
рдкреИрдХреЗрдЬ рдПрдореНрдмреЗрдб::рд╕реНрдерд╛рдпреА;
#persistent.pl
рд╕рдЦреНрдд рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ;
рд╣рдорд╛рд░рд╛ %рдХреИрд╢;
рдкреНрд░рддреАрдХ qw(delete_package) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ;
рдЙрдк рд╡реИрдз_рдкреИрдХреЗрдЬ_рдирд╛рдо {
рдореЗрд░реА($рд╕реНрдЯреНрд░рд┐рдВрдЧ) = @_;
$string =~ s/([^A-Za-z0-9\/])/sprintf("_%2x",unpack("C",$1))/рдЙрджрд╛рд╣рд░рдг;
# рдХреЗрд╡рд▓ рдЕрдВрдХ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдкрд╛рд╕
$string =~ s|/(\d)|sprintf("/_%2x",unpack("C",$1))|рдЙрджрд╛рд╣рд░рдг;
# рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреИрдХреЗрдЬ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдпрд╛рд░ рдХрд░реЗрдВ
$string =~ s|/|::|g;
рд╡рд╛рдкрд╕реА "рдПрдореНрдмреЗрдб"ред $рд╕реНрдЯреНрд░рд┐рдВрдЧ;
}
рдЙрдк eval_file {
рдореЗрд░рд╛($рдлрд╝рд╛рдЗрд▓ рдирд╛рдо, $рд╣рдЯрд╛рдПрдВ) = @_;
рдореЗрд░рд╛ $рдкреИрдХреЗрдЬ = рд╡реИрдз_рдкреИрдХреЗрдЬ_рдирд╛рдо($рдлрд╝рд╛рдЗрд▓рдирд╛рдо);
рдореЗрд░рд╛ $mtime = -M $рдлрд╝рд╛рдЗрд▓рдирд╛рдо;
рдпрджрд┐(рдкрд░рд┐рднрд╛рд╖рд┐рдд $рдХреИрд╢{$рдкреИрдХреЗрдЬ}{mtime}
&&
$рдХреИрд╢{$рдкреИрдХреЗрдЬ}{mtime} <= $mtime)
{
# рд╣рдордиреЗ рдЗрд╕ рд╕рдмрд░реВрдЯреАрди рдХреЛ рдкрд╣рд▓реЗ рд╣реА рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ,
# рдЗрд╕реЗ рдбрд┐рд╕реНрдХ рдкрд░ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрд░рдиреЗ рдХреЛ рдХреБрдЫ рдирд╣реАрдВ рдмрдЪрд╛ рд╣реИ
рдкреНрд░рд┐рдВрдЯ STDERR "рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрдХрд▓рд┐рдд $package->рд╣реИрдВрдбрд▓рд░\n";
}
рдФрд░ {
рд╕реНрдерд╛рдиреАрдп *рдПрдлрдПрдЪ;
FH, $рдлрд╝рд╛рдЗрд▓рдирд╛рдо рдЦреЛрд▓реЗрдВ рдпрд╛ "рдУрдкрди '$рдлрд╝рд╛рдЗрд▓рдирд╛рдо' $!" рдЦреЛрд▓реЗрдВ;
рд╕реНрдерд╛рдиреАрдп($/) = рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд;
рдореЗрд░рд╛ $sub= ;
рдПрдлрдПрдЪ рдмрдВрдж рдХрд░реЗрдВ;
#рдХреЛрдб рдХреЛ рд╣рдорд╛рд░реЗ рдЕрдиреВрдареЗ рдкреИрдХреЗрдЬ рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕рдмрд░реВрдЯреАрди рдореЗрдВ рд▓рдкреЗрдЯреЗрдВ
рдореЗрд░рд╛ $eval = qq{рдкреИрдХреЗрдЬ $рдкреИрдХреЗрдЬ; рдЙрдк рд╣реИрдВрдбрд▓рд░ {$рдЙрдк; }};
{
# рдЗрд╕ рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░ рд╣рдорд╛рд░реЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдЫреБрдкрд╛рдПрдВ
рдореЗрд░рд╛($рдлрд╝рд╛рдЗрд▓ рдирд╛рдо,$mtime,$рдкреИрдХреЗрдЬ,$рдЙрдк);
eval $eval;
}
$@ рдорд░реЛ рдЕрдЧрд░ $@;
рдЗрд╕реЗ #рдХреИрд╢ рдХрд░реЗрдВ рдЬрдм рддрдХ рд╣рдо рд╣рд░ рдмрд╛рд░ рд╕рдлрд╛рдИ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ
$рдХреИрд╢{$рдкреИрдХреЗрдЬ}{mtime} = $mtime рдЬрдм рддрдХ $рд╣рдЯрд╛рдПрдВ рдирд╣реАрдВ;
}
eval {$package->рд╣реИрдВрдбрд▓рд░;};
$@ рдорд░реЛ рдЕрдЧрд░ $@;
delete_package($package) рдпрджрд┐ $delete;
# рдЪрд╛рд╣реЛ рддреЛ рджреЗрдЦ рд▓реЛ
#рдкреНрд░рд┐рдВрдЯ рдбреЗрд╡реЗрд▓::Symdump->rnew($package)->as_string, $/;
}
1;
__рд╕рдорд╛рдкреНрдд__
/* рд▓рдЧрд╛рддрд╛рд░.c */
#рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛
#рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛
/* 1 = рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рдж рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреА рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рд╕рд╛рдлрд╝ рдХрд░реЗрдВ,
0=рдирд╣реАрдВ
*/
#ifndef DO_CLEAN
#DO_CLEAN 0 рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
#endif
#рдмрдлрд╝рд░_рдЖрдХрд╛рд░ 1024 рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
рд╕реНрдерд┐рд░ рдкрд░реНрд▓рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ *my_perl = NULL;
int
рдореБрдЦреНрдп(int argc, char **argv, char **env)
{
рдЪрд╛рд░ *рдПрдореНрдмреЗрдбрд┐рдВрдЧ[] = { "", "persistent.pl" };
рдЪрд╛рд░ *args[] = { "", DO_CLEAN, NULL };
рдЪрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо[BUFFER_SIZE];
рдкреВрд░реНрдгрд╛рдВрдХ рдирд┐рдХрд╛рд╕рд╕реНрдерд┐рддрд┐ = 0;
PERL_SYS_INIT3(&argc,&argv,&env);
рдЕрдЧрд░((my_perl = perl_alloc()) == рд╢реВрдиреНрдп) {
fprintf(stderr, "рдХреЛрдИ рд╕реНрдореГрддрд┐ рдирд╣реАрдВ!");
рдирд┐рдХрд╛рд╕; (1)
}
perl_construct(my_perl);
PL_origalen = 1; /* $0 рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рди рдХрд░рдиреЗ рджреЗрдВ
рдкреНрд░реЙрдХреНрдЯрд╛рдЗрдЯрд▓ рдпрд╛ рдПрдореНрдмреЗрдбрд┐рдВрдЧ[0] */
рдПрдЧреНрдЬрд┐рдЯрд╕реНрдЯреИрдЯрд╕ = perl_parse(my_perl, NULL, 2, рдПрдореНрдмреЗрдбрд┐рдВрдЧ, NULL);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
рдЕрдЧрд░(!exitstatus) {
рдирд┐рдХрд╛рд╕ рд╕реНрдерд┐рддрд┐ = perl_run(my_perl);
рдЬрдмрдХрд┐ (рдкреНрд░рд┐рдВрдЯрдл ("рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ:") &&
fgets(рдлрд╝рд╛рдЗрд▓ рдирд╛рдо, BUFFER_SIZE, stdin)) {
рдлрд╝рд╛рдЗрд▓ рдирд╛рдо[strlen(рдлрд╝рд╛рдЗрд▓ рдирд╛рдо)-1] = '\0'; /* рдкрдЯреНрдЯреА \n */
/* рд╕рдмрд░реВрдЯреАрди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ,
рдЗрд╕реЗ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ */
рддрд░реНрдХ[0] = рдлрд╝рд╛рдЗрд▓ рдирд╛рдо;
call_argv('рдПрдореНрдмреЗрдб::рдкрд░реНрд╕рд┐рд╕реНрдЯреЗрдВрдЯ::eval_file'',
G_рддреНрдпрд╛рдЧреЗрдВ | G_EVAL, args);
/* рдЪреЗрдХ $@ */
рдпрджрд┐(SvTRUE(ERRSV))
fprintf(stderr, "eval рддреНрд░реБрдЯрд┐: %s\n", SvPV_nolen(ERRSV));
}
}
PL_perl_destruct_level = 0;
perl_destruct(my_perl);
perl_free(my_perl);
PERL_SYS_TERM();
рдирд┐рдХрд╛рд╕(рдирд┐рдХрд╛рд╕рд╕реНрдерд┐рддрд┐);
}
рдЕрдм рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:
% cc -o рд▓рдЧрд╛рддрд╛рд░ рд▓рдЧрд╛рддрд╛рд░.c \
`perl -MExtUtils::Embed -e ccopts -e ldopts`
рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рд╣реИ:
#test.pl
рдореЗрд░реА $рд╕реНрдЯреНрд░рд┐рдВрдЧ = "рд╣реИрд▓реЛ";
рдлреВ($рд╕реНрдЯреНрд░рд┐рдВрдЧ);
рдЙрдк рдлреВ {
рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ "рдлреВ рдХрд╣рддрд╛ рд╣реИ: @_\n";
}
рдЕрдм рдЪрд▓рд╛рдПрдВ:
% рдЬрд╝рд┐рджреНрджреА
рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ: test.pl
рдлреВ рдХрд╣рддреЗ рд╣реИрдВ: рдирдорд╕реНрддреЗ
рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ: test.pl
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрдХрд▓рд┐рдд Embed::test_2epl->рд╣реИрдВрдбрд▓рд░
рдлреВ рдХрд╣рддреЗ рд╣реИрдВ: рдирдорд╕реНрддреЗ
рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ: ^C
рдирд┐рд╖реНрдкрд╛рджрди of рдЕрдВрдд рдмреНрд▓реЙрдХ
рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ END рдмреНрд▓реЙрдХ рдХреЛ perl_run рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреА рд╡рдЬрд╣ рд╕реЗ
рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдПрдБ рдЬреЛ рдХрднреА рднреА perl_run рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗред рдЪреВрдВрдХрд┐ рдкрд░реНрд▓ 5.7.2 рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдирдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "PL_exit_flags |= PERL_EXIT_DESTRUCT_END"ред рдпрд╣ рднреА рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ
рдпрджрд┐ perl_parse рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рддреЛ END рдмреНрд▓реЙрдХ рдЪрд▓рд╛рдирд╛ рдФрд░ "perl_destruct" рдирд┐рдХрд╛рд╕ рд▓реМрдЯрд╛ рджреЗрдЧрд╛
рдореВрд▓реНрдп.
$0 рдХрд╛рд░реНрдп
рдЬрдм рдПрдХ рдкрд░реНрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ $0 рдХрд╛ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреА рд╣реИ рддреЛ рдкрд░реНрд▓ рд░рдирдЯрд╛рдЗрдо рдЗрд╕ рдорд╛рди рдХреЛ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛
argv рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдИ рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдХреЗ "ps" рджреНрд╡рд╛рд░рд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдПрдВ
рдкрд╛рд╕ рдХрд┐рдпрд╛ perl_parse() рдФрд░ рдПрдкреАрдЖрдИ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рднреА рдХреЙрд▓ рдХрд░рдирд╛ рдЬреИрд╕реЗ рд╕реЗрдЯрдкреНрд░реЛрдХреНрдЯрд╛рдЗрдЯрд▓() рдХрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
рдкрд░реНрд▓ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдкрд╣рд▓реЗ рд╡реЗрд░рд┐рдПрдмрд▓ "PL_origalen" рдХреЛ рдорд╛рди 1 рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ perl_parse() рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
RSI рд▓рдЧрд╛рддрд╛рд░.рд╕реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ $0 рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рд╕реЗрдЧрдлреЙрд▓реНрдЯ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ
рдпрджрд┐ "PL_origalen = 1;" рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдкрд░реНрд▓ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛
"рдПрдореНрдмреЗрдбрд┐рдВрдЧ[]" рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдореЗрдореЛрд░реАред
рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рджреБрднрд╛рд╖рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдгреЛрдВ
рдХреБрдЫ рджреБрд░реНрд▓рдн рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдПрдХ рд╕рддреНрд░ рдХреЗ рджреМрд░рд╛рди рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдРрд╕рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЫрд┐рдЯрдкреБрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реЗ рдХрд┐рд╕реА рднреА рд╕рдВрд╕рд╛рдзрди рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХрддрд╛ рд╣реИ
рджреБрднрд╛рд╖рд┐рдпрд╛ред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдРрд╕рд╛ рд╣реЛ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдЧрд▓рд╛ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╣реИ
рдирд┐рд░реНрдорд┐рдд. рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЬрдм рдкрд░реНрд▓ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реИрд╢реНрд╡рд┐рдХ
рд╡реЗрд░рд┐рдПрдмрд▓ "PL_perl_destruct_level" рдХреЛ 0 рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдлрд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ
рдЬрдм рдХреЛрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдкрдиреЗ рдкреВрд░реЗ рдЬреАрд╡рдирдХрд╛рд▓ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рджреБрднрд╛рд╖рд┐рдпрд╛ рдмрдирд╛рддрд╛ рд╣реИред
"PL_perl_destruct_level" рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рд╕рдм рдХреБрдЫ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:
рдЬрдм(1) {
...
/* PL_perl_destruct_level = 1 рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ */
PL_perl_destruct_level = 1;
perl_construct(my_perl);
...
/* perl_destruct рдХреЗ рджреМрд░рд╛рди _everything_ рдХреЛ рд╕рд╛рдл рдФрд░ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ */
PL_perl_destruct_level = 1;
perl_destruct(my_perl);
perl_free(my_perl);
...
/*рдЪрд▓реЛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВ! */
}
. perl_destruct() рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╛рд░реНрд╕ рдЯреНрд░реА рдФрд░ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛рдПрдБ рд╣реИрдВ
рд╕рд╛рдлрд╝ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рд░реАрд╕реЗрдЯ рдХрд░ рджрд┐рдП рдЧрдП рд╣реИрдВред рдХреЛ рджреВрд╕рд░рд╛ рдХрд╛рд░реНрдпрднрд╛рд░
"PL_perl_destruct_level" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ perl_construct рдЗрд╕реЗ 0 рдкрд░ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдЪрд▓ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╣реИ
рд╡реНрдпрд╡рд╣рд╛рд░реНрдп, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рддрднреА рдЬрдм рдЖрдкрдиреЗ рдХреЙрдиреНрдлрд┐рдЧрд░ рд╡рд┐рдХрд▓реНрдк "-Dusemultiplicity" рдпрд╛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реЛ
рдкрд░реНрд▓ рдмрдирд╛рддреЗ рд╕рдордп "-Duseithreads -Duseithreads"ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рддрд┐-рджреБрднрд╛рд╖рд┐рдпрд╛ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ "PL_perl_destruct_level" рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ,
рддрд╛рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдлрд╛рдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реЛ рдФрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЪрд░ рдкреНрд░рд╛рд░рдВрдн рд╣реЛ рдЬрд╛рдПрдВ
рд╕рд╣реА рдврдВрдЧ рд╕реЗ. рднрд▓реЗ рд╣реА рдЖрдкрдХрд╛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рджреЛ рдпрд╛ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рджреБрднрд╛рд╖рд┐рдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рди рд╣реЛ, рд▓реЗрдХрд┐рди
рдЙрдиреНрд╣реЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣, рдЗрд╕рдХреЗ рд╕рд╛рде рдкрд░реНрд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ
"-Dusemultiplicity" рд╡рд┐рдХрд▓реНрдк рдЕрдиреНрдпрдерд╛ рдХреБрдЫ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЪрд░ рдкреНрд░рд╛рд░рдВрдн рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ
рд▓рдЧрд╛рддрд╛рд░ рд░рди рдХреЗ рдмреАрдЪ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд░реИрд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдкрд░реНрд▓рдХреНрд╕ рдореЗрдВ "рдереНрд░реЗрдб-рдЕрд╡реЗрдпрд░ рд╕рд┐рд╕реНрдЯрдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕" рднреА рджреЗрдЦреЗрдВред
"-Dusemultiplicity" рдХреЗ рдмрдЬрд╛рдп "-Dusethreads -Duseithreads" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИ рдпрджрд┐
рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдПрдХ рд╕рд╛рде рдХрдИ рджреБрднрд╛рд╖рд┐рдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣
рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреА рдереНрд░реЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред
рдЖрдЗрдП рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рдЖрдЬрд╝рдорд╛рдХрд░ рджреЗрдЦрддреЗ рд╣реИрдВ:
#рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛
#рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛
/* рд╣рдо рджреЛ рджреБрднрд╛рд╖рд┐рдпреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ */
#рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ SAY_HELLO "-e", "рдкреНрд░рд┐рдВрдЯ qq(рд╣рд╛рдп, рдореИрдВ $^X\n рд╣реВрдВ)"
int рдореБрдЦреНрдп(int argc, char **argv, char **env)
{
рдкрд░реНрд▓рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ *рдПрдХ_рдкрд░реНрд▓, *рджреЛ_рдкрд░реНрд▓;
рдЪрд╛рд░ *one_args[] = { "one_perl", SAY_HELLO };
рдЪрд╛рд░ *two_args[] = { "two_perl", SAY_HELLO };
PERL_SYS_INIT3(&argc,&argv,&env);
one_perl = perl_alloc();
two_perl = perl_alloc();
PERL_SET_CONTEXT(one_perl);
perl_construct(one_perl);
PERL_SET_CONTEXT(two_perl);
perl_construct(two_perl);
PERL_SET_CONTEXT(one_perl);
perl_parse(one_perl, NULL, 3, one_args, (char **)NULL);
PERL_SET_CONTEXT(two_perl);
perl_parse(two_perl, NULL, 3, two_args, (char **)NULL);
PERL_SET_CONTEXT(one_perl);
perl_run(one_perl);
PERL_SET_CONTEXT(two_perl);
perl_run(two_perl);
PERL_SET_CONTEXT(one_perl);
perl_destruct(one_perl);
PERL_SET_CONTEXT(two_perl);
perl_destruct(two_perl);
PERL_SET_CONTEXT(one_perl);
perl_free(one_perl);
PERL_SET_CONTEXT(two_perl);
perl_free(two_perl);
PERL_SYS_TERM();
}
рдХреЛ рдХреЙрд▓ рдиреЛрдЯ рдХрд░реЗрдВ PERL_SET_CONTEXT(). рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ
рдпрд╣ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдпрд╛ рдереНрд░реЗрдб рдкрд░ "рд╡рд░реНрддрдорд╛рди" рд╣реИ
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдЗрд╕реЗ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реЛред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╣реИрдВ рддреЛ рдЗрд╕рдХрд╛ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рдФрд░ рдЗрдВрдЯрд░рд▓реАрд╡реНрдб рддрд░реАрдХреЗ рд╕реЗ рджреЛрдиреЛрдВ рджреБрднрд╛рд╖рд┐рдпреЛрдВ рдкрд░ рдкрд░реНрд▓ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЬрдм рднреА рдХрд┐рд╕реА рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ "рдЗрдВрдЯрд░рдкреА" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ PERL_SET_CONTEXT(interp) рдХреЛ рднреА рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рдЗрд╕реЗ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ (рдпрд╛ рддреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред perl_alloc(), рдпрд╛ рдЕрдзрд┐рдХ рдЧреВрдврд╝ рдкрд░реНрд▓_рдХреНрд▓реЛрди()).
рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:
% cc -o рдмрд╣реБрд▓рддрд╛ рдмрд╣реБрд▓рддрд╛.c \
`perl -MExtUtils::Embed -e ccopts -e ldopts`
рдЗрд╕реЗ рдЪрд▓рд╛рдУ, рдЗрд╕реЗ рдЪрд▓рд╛рдУ:
% рдмрд╣реБрд▓рддрд╛
рдирдорд╕реНрддреЗ, рдореИрдВ one_perl рд╣реВрдВ
рдирдорд╕реНрддреЗ, рдореИрдВ two_perl рд╣реВрдБ
рдХрд╛ рдкреНрд░рдпреЛрдЧ рдкрд░реНрд▓ рдореЙрдбреНрдпреВрд▓, рдХреМрди рдХреМрди рд╕реЗ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧ C рдкреБрд╕реНрддрдХрд╛рд▓рдп, рд╕реЗ рддреБрдВрд╣рд╛рд░реЗ C рдХрд╛рд░реНрдпрдХреНрд░рдо
рдпрджрд┐ рдЖрдкрдиреЗ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рдЙрдкрдпреЛрдЧ()рд╕рд╛ рдкрд░реНрд▓
рдореЙрдбреНрдпреВрд▓ (рдЬреИрд╕реЗ рдЧрд░реНрддрд┐рдХрд╛) рдЬреЛ рд╕реНрд╡рдпрдВ C рдпрд╛ C++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╕рдВрднрд╡рддрдГ рдРрд╕рд╛ рд╣реБрдЖ:
рдореЙрдбреНрдпреВрд▓ рд╕реЙрдХреЗрдЯ рд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛, рдЗрд╕ рдкрд░реНрд▓ рдореЗрдВ рдбрд╛рдпрдирд╛рдорд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред
(рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдкрд░реНрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рдпрд╛ рддреЛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ
рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд┐рдВрдЧ рдпрд╛ рд╕реЙрдХреЗрдЯ рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЗрд╕рдореЗрдВ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред)
рдХреНрдпрд╛ рдЧрд▓рдд?
рдЖрдкрдХрд╛ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЗрди рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдПред рдП
рдереЛрдбрд╝рд╛ рдЧреЛрдВрдж рдорджрдж рдХрд░реЗрдЧрд╛. рдЕрдм рддрдХ рдЖрдк рдХреЙрд▓ рдХрд░рддреЗ рд░рд╣реЗ рд╣реИрдВ perl_parse(), рдЗрд╕реЗ рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рд╕реМрдВрдкрдирд╛
рджреВрд╕рд░рд╛ рддрд░реНрдХ:
perl_parse(my_perl, NULL, argc, my_argv, NULL);
рдпрд╣реАрдВ рдкрд░ рдкрд░реНрд▓ рдФрд░ рдХреЗ рдмреАрдЪ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрдкрд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд▓реВ рдХреЛрдб рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рд▓рд┐рдВрдХреНрдб C/C++ рд░реВрдЯреАрдиред рдЖрдЗрдпреЗ рдХреБрдЫ рдЕрдВрд╢реЛрдВ рдкрд░ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ perlmain.c рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкрд░реНрд▓ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ
рдЗрд╕:
рд╕реНрдерд┐рд░ рд╢реВрдиреНрдп xs_init (pTHX);
EXTERN_C рд╢реВрдиреНрдп рдмреВрдЯ_рдбрд╛рдпрдирд╛рд▓реЛрдбрд░ (pTHX_ CV* cv);
EXTERN_C рд╢реВрдиреНрдп рдмреВрдЯ_рд╕реЙрдХреЗрдЯ (pTHX_ CV* cv);
EXTERN_C рд╢реВрдиреНрдп
xs_init(pTHX)
{
рдЪрд╛рд░ *рдлрд╝рд╛рдЗрд▓ = __рдлрд╝рд╛рдЗрд▓__;
/* рдбрд╛рдпрдирд╛рд▓реЛрдбрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ */
newXS('DynaLoader::boot_DynaLoader', Boot_DynaLoader, рдлрд╝рд╛рдЗрд▓);
newXS ("рд╕реЙрдХреЗрдЯ::рдмреВрдЯрд╕реНрдЯреНрд░реИрдк", рдмреВрдЯ_рд╕реЙрдХреЗрдЯ, рдлрд╝рд╛рдЗрд▓);
}
рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ: рдЖрдкрдХреЗ рдкрд░реНрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╕реЗ рдЬреБрдбрд╝реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд▓рд┐рдП (рдЗрд╕рдХреЗ рджреМрд░рд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд)ред
рдЖрдкрдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдпрд╛ рдПрдХ рдирдпрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬреЛрдбрд╝рддреЗ рд╕рдордп), рдПрдХ рдкрд░реНрд▓ рд╕рдмрд░реВрдЯреАрди
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдо рддреМрд░ рдкрд░, рдЙрд╕ рд╕рдмрд░реВрдЯреАрди рдХреЛ рдирд╛рдо рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдореЙрдбреНрдпреВрд▓::рдмреВрдЯрд╕реНрдЯреНрд░реИрдк() рдФрд░ рдЬрдм рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрд╣реНрд╡рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЙрдкрдпреЛрдЧ рдореЙрдбреНрдпреВрд▓. рдмрджрд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рдореЗрдВ рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ
рдПрдХреНрд╕рдПрд╕рдпреВрдмреА, рдмреВрдЯ_рдореЙрдбреНрдпреВрд▓, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ XSUB рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реНрд▓ рд╕рдордХрдХреНрд╖ рдмрдирд╛рддрд╛ рд╣реИред
рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдордд рдХрд░реЛ; рдЙрд╕ рдкрд░ рдЫреЛрдбрд╝ рджреЛ xsubpp рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд▓реЗрдЦрдХред рдЕрдкрдиреЗ рдЕрдЧрд░
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, DynaLoader рдмрдирд╛рддрд╛ рд╣реИ рдореЙрдбреНрдпреВрд▓::рдмреВрдЯрд╕реНрдЯреНрд░реИрдк() рдЖрдкрдХреЗ рд▓рд┐рдП
рдЙрдбрд╝рдирд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдбрд╛рдпрдирд╛рд▓реЛрдбрд░ рд╣реИ рддреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреА рд╢рд╛рдпрдж рд╣реА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА
рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдХреЛрдИ рдЕрдиреНрдп рдПрдХреНрд╕рдЯреЗрдВрд╢рдиред
рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рдХреЛрдб рд╣реЛ, рддреЛ рдЗрд╕реЗ рджреВрд╕рд░реЗ рддрд░реНрдХ рдореЗрдВ рдбрд╛рд▓реЗрдВ perl_parse():
perl_parse(my_perl, xs_init, argc, my_argv, NULL);
рдлрд┐рд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:
% cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
% рдЗрдВрдЯрд░рдк
рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ;
SomDynamicalLoadedModule рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ;
рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ "рдЕрдм рдореИрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ!\n"'
ExtUtils::рдПрдореНрдмреЗрдб рд▓реЗрдЦрди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ xs_init рдЧреЛрдВрдж рдХреЛрдб.
% perl -MExtUtils::рдПрдореНрдмреЗрдб -e xsinit -- -o perlxsi.c
% cc -c perlxsi.c `perl -MExtUtils::Embed -e ccopts`
% cc -c interp.c `perl -MExtUtils::Embed -e ccopts`
% cc -o interp perlxsi.o interp.o `perl -MExtUtils::Embed -e ldopts`
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП perlxs, perlguts рдФрд░ perlapi рд╕реЗ рдкрд░рд╛рдорд░реНрд╢ рд▓реЗрдВред
рдХрд╛ рдкреНрд░рдпреЛрдЧ рдПрдореНрдмреЗрдбреЗрдб рдкрд░реНрд▓ рд╕рд╛рде рдореЗрдВ POSIX рд╕реНрдерд╛рдиреАрдп
(рдЗрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдкрд░реНрд▓рд▓реЛрдХреЗрд▓ рджреЗрдЦреЗрдВред) рдЬрдм рдПрдХ рдкрд░реНрд▓ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ,
рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓реЛрдХреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдРрд╕рд╛ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд╣реАрдВ
рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ, "C" рдпрд╛ "POSIX" рд▓реЛрдХреЗрд▓ред рдкрд░реНрд▓ рдХреЛрдб рдХреЗ рднреАрддрд░ "рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ" рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИ, рдпрд╣
рдЕрдзрд┐рдХрддрд░ рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдкреЗрд░рд▓реЛрдХреЗрд▓ рдореЗрдВ "рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ" рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦреЗрдВ)ред
рд╕рд╛рде рд╣реА, рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдПрдореНрдмреЗрдбреЗрдб рдкрд░реНрд▓ рдореЗрдВ рдЬрд┐рд╕ рд▓реЛрдХреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ
рд╕рд┐рд╕реНрдЯрдо рдбрд┐рдлреЙрд▓реНрдЯ рдХреЗ рд╕рдорд╛рдиред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдкрдиреЗ рд╕реЗрдЯрдЕрдк рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдПрдХ рдРрд╕рд╛ рд╕реНрдерд╛рди рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рд╣реИред рдкрд░реНрд▓ v5.20 рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ, рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ
рдПрдореНрдмреЗрдбреЗрдб рдкрд░реНрд▓ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд┐ рд▓реЛрдХреЗрд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдареАрдХ рд╕реЗ рд╕реЗрдЯ рдЕрдк рд╣реИ, рдФрд░ рдРрд╕рд╛ рдХрд░рдирд╛ рдЫреЛрдбрд╝ рджреЗрдВ
рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдЖрд░рдВрднреАрдХрд░рдг рд╣реИред рдпрджрд┐ рдкрд░реНрдпрд╛рд╡рд░рдг рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╣реИ рддреЛ рдпрд╣ рд╕реНрдХрд┐рдк рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
"PERL_SKIP_LOCALE_INIT" рд╕реЗрдЯ рд╣реИ (рднрд▓реЗ рд╣реА 0 рдпрд╛ "" рдкрд░ рд╕реЗрдЯ рд╣реЛ)ред рдПрдХ рдкрд░реНрд▓ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдХреНрд╖рдорддрд╛ рд╣реИ
C рдкреНрд░реА-рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреНрд░рддреАрдХ "HAS_SKIP_LOCALE_INIT" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЙрд╕ рдХреЛрдб рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╣реИ
рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкрд░реНрд▓ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдХрд┐рд╕реА рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдкрд╣рд▓реЗ рдкрд░реНрд▓.
рдЫреБрдкрд╛ рд░рд╣реЗ рд╣реИ рдкрд░реНрд▓_
рдпрджрд┐ рдЖрдк рдкрд░реНрд▓ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдкреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рдЫреБрдкрд╛рддреЗ рд╣реИрдВ, рддреЛ -DPERL_NO_SHORT_NAMES рдЬреЛрдбрд╝реЗрдВ
рд╕рдВрдХрд▓рди рдЭрдВрдбреЗ рдХреЗ рд▓рд┐рдП. рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп
рдЪреЗрддрд╛рд╡рдиреА('рджреАрд╡рд╛рд░ рдкрд░ рдмреАрдпрд░ рдХреА %d рдмреЛрддрд▓реЗрдВ', рдмреЛрддрд▓реЛрдВ рдХреА рдЧрд┐рдирддреА);
рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рдлреБрд▓ рдлреЙрд░реНрдо рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛
Perl_warn(aTHX_ "рджреАрд╡рд╛рд░ рдкрд░ рдмреАрдпрд░ рдХреА %d рдмреЛрддрд▓реЗрдВ", рдмреЛрддрд▓реЛрдВ рдХреА рдЧрд┐рдирддреА);
(рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП perlguts рдореЗрдВ "рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ PERL_IMPLICIT_CONTEXT" рджреЗрдЦреЗрдВ)
"aTHX_"ред ) рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдмреБрд░рд╛рдЗрдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдкреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ (рд╕реА
рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдпрд╛ рдЕрдиреНрдпрдерд╛) рдЕрдиреНрдп рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИ (рдкрд░реНрд▓ рд▓рдЧрднрдЧ 2400 рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ
рдЗрди рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдореЛрдВ рд╡рд╛рд▓реЗ рдПрдкреАрдЖрдИ, рдХреБрдЫ рд╕реМ рд▓реЗрддреЗ рд╣реИрдВ рдпрд╛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрдЧрд╣ рд╣реИ
рдЯрдХрд░рд╛рд╡ред)
рдиреИрддрд┐рдХ
рдЖрдк рдХрднреА-рдХрднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓рд┐рдЦрдирд╛ рдФрд░ рддреЗрдЬ рдХреЛрдб рд╕реА рдореЗрдВ, рд▓реЗрдХрд┐рди рдЖрдк рд╣рдореЗрд╢рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓рд┐рдЦрдирд╛ рдХреЛрдб рдФрд░ рддреЗрдЬ рдкрд░реНрд▓ рдореЗрдВ.
рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
onworks.net рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдирд▓рд╛рдЗрди perlembed рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ