เบžเบฒเบชเบฒเบญเบฑเบ‡เบเบดเบ”เบžเบฒเบชเบฒเบเบฃเบฑเปˆเบ‡เปเบญเบชเบ›เบฒเป‚เบเบ™

OnWorks favicon

perlcall - เบญเบญเบ™เบฅเบฒเบเปƒเบ™เบ„เบฅเบฒเบง

เป€เบ›เบตเบ”เปƒเบŠเป‰ perlcall เปƒเบ™ OnWorks เบœเบนเป‰เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบŸเบฃเบตเบœเปˆเบฒเบ™ Ubuntu Online, Fedora Online, Windows online emulator เบซเบผเบท MAC OS online emulator

เบ™เบตเป‰เปเบกเปˆเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡ perlcall เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป„เบ”เป‰เปƒเบ™ OnWorks เบœเบนเป‰เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบŸเบฃเบตเป‚เบ”เบเปƒเบŠเป‰เบซเบ™เบถเปˆเบ‡เปƒเบ™เบซเบผเบฒเบเป†เบšเปˆเบญเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบญเบญเบ™เป„เบฅเบ™เปŒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบฑเปˆเบ™ Ubuntu Online, Fedora Online, Windows online emulator เบซเบผเบท MAC OS online emulator

เป‚เบ„เบ‡เบเบฒเบ™:

NAME


perlcall - เบชเบปเบ™เบ—เบดเบชเบฑเบ™เบเบฒเบเบฒเบ™เป‚เบ— Perl เบˆเบฒเบ C

เบฅเบฒเบเบฅเบฐเบญเบฝเบ”


เบˆเบธเบ”โ€‹เบ›เบฐโ€‹เบชเบปเบ‡โ€‹เบ‚เบญเบ‡โ€‹เป€เบญโ€‹เบเบฐโ€‹เบชเบฒเบ™โ€‹เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เป€เบžเบทเปˆเบญโ€‹เบชเบฐโ€‹เปเบ”เบ‡โ€‹เปƒเบซเป‰โ€‹เบ—เปˆเบฒเบ™โ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เป‚เบ—โ€‹เบซเบฒ subroutines Perl เป‚เบ”เบโ€‹เบเบปเบ‡โ€‹เบˆเบฒเบ Cโ€‹,
ie, เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™ เป‚เบ—เบเบฑเบš.

เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš C เบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เป‚เบ”เบ Perl เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ‚เบฝเบ™ callbacks เป€เบญเบเบฐเบชเบฒเบ™
เปƒเบŠเป‰เบŠเบธเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบ•เบปเบงเบˆเบดเบ‡เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”. เปƒเบ™
เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบšเบฒเบ‡เป€เบ•เบฑเบเบ™เบดเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ coding callbacks เปเบกเปˆเบ™เบเบงเบกเป€เบญเบปเบฒ.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป‚เบ—เบซเบฒเบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™เบ›เบฐเบเบญเบšเบกเบต

ยท เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”

เบ—เปˆเบฒเบ™เป„เบ”เป‰เบชเป‰เบฒเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš XSUB เบเบฑเบš C API เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™.

เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบปเปˆเบงเป„เบ›เบ—เบตเปˆเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบขเบนเปˆเปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆ C เบ—เบตเปˆ
เบˆเบฐเบ–เบทเบเป€เบญเบตเป‰เบ™เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบšเปเปˆเบ”เบตเป€เบเบตเบ”เบ‚เบถเป‰เบ™. เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เปเบกเปˆเบ™เบชเบฒเบกเบฒเบ”
เบฅเบฐโ€‹เบšเบธโ€‹เป‚เบ›เบฃโ€‹เปเบเบฃเบกเบเปˆเบญเบ Perl เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบ–เบทเบโ€‹เป€เบญเบตเป‰เบ™โ€‹เปเบ—เบ™.

ยท เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบ‚เบฑเบšเป€เบ„เบทเปˆเบญเบ™เป‚เบ”เบเป€เบซเบ”เบเบฒเบ™

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ„เบฅเบฒเบชเบชเบดเบเบ‚เบญเบ‡เบšเปˆเบญเบ™เบ—เบตเปˆ callbacks เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปเบกเปˆเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ‚เบฝเบ™เป€เบซเบ”เบเบฒเบ™เบ—เบตเปˆเบ‚เบฑเบšเป€เบ„เบทเปˆเบญเบ™
เป‚เบ„เบ‡เบเบฒเบ™, เป€เบŠเบฑเปˆเบ™: เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ X11. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบ—เปˆเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™
เป€เบญเบตเป‰เบ™เบงเปˆเบฒเบ—เบธเบเป€เบซเบ”เบเบฒเบ™เบชเบฐเป€เบžเบฒเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™, เบ•เบปเบงเบขเปˆเบฒเบ‡, เบเบปเบ”เบ›เบธเปˆเบกเบซเบ™เบนเบ–เบทเบเบเบปเบ”, เบ•เบปเบงเบเบฐเบžเบดเบš
เบเป‰เบฒเบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบซเบผเบทเบฅเบฒเบเบเบฒเบ™เป€เบกเบ™เบนเบ–เบทเบเป€เบฅเบทเบญเบ.

เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเป€เบ•เบฑเบเบ™เบดเบเบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เปเบกเปˆเบ™เปƒเบŠเป‰เป„เบ”เป‰เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฑเบ‡ Perl เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™ C,
เบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เป€เบ›เบปเป‰เบฒเปเบฒเบเบซเบผเบฑเบเบ‚เบญเบ‡เป€เบญเบเบฐเบชเบฒเบ™เบ™เบตเป‰. เบกเบตเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบญเบทเปˆเบ™เป†เบ—เบตเปˆเบˆเบฐเบ•เป‰เบญเบ‡เป€เบ›เบฑเบ™
เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเปเบฅเบฐเบชเบฐเป€เบžเบฒเบฐเบเบฑเบšเบเบฒเบ™เบเบฑเบ‡ Perl. เบชเปเบฒเบฅเบฑเบšเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบเบฑเบ‡ Perl เปƒเบ™ C เป€เบšเบดเปˆเบ‡
perlembed.

เบเปˆเบญเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเบฐเป€เบ›เบตเบ”เบ•เบปเบงเบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡เป€เบ›เบฑเบ™เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบ‚เบญเบ‡เป€เบญเบเบฐเบชเบฒเบ™เบ™เบตเป‰, เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบ”เบต
เบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบญเปˆเบฒเบ™เบชเบญเบ‡เป€เบญเบเบฐเบชเบฒเบ™เบ•เปเปˆเป„เบ›เบ™เบตเป‰ - perlxs เปเบฅเบฐ perlguts.

เบเบฒเบ™ เป‚เบ—_ FUNCTIONS


เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบชเบดเปˆเบ‡เบ™เบตเป‰เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ•เปเปˆเบเบฒเบ™เบญเบฐเบ—เบดเบšเบฒเบเป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปเบฒเบญเบดเบ”เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฎเบนเป‰เบˆเปเบฒเบ™เบงเบ™เบซเบ™เป‰เบญเบเบซเบ™เบถเปˆเบ‡
เบ„เปเบฒเบ™เบดเบเบฒเบกเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™.

Perl เบกเบตเบˆเปเบฒเบ™เบงเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆ C เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เป‚เบ—เบซเบฒ Perl subroutines. เบžเบงเบโ€‹เป€เบ‚เบปเบฒโ€‹เปเบกเปˆเบ™

I32 call_sv(SV* sv, เบ—เบธเบ‡ I32);
I32 call_pv(char *เบŠเบทเปˆเบเปˆเบญเบ, เบ—เบธเบ‡ I32);
I32 call_method(char *methname, เบ—เบธเบ‡ I32);
I32 call_argv(char *subname, I32 flags, char **argv);

เบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เปเบกเปˆเบ™ call_sv. เบซเบ™เป‰เบฒเบ—เบตเปˆเบญเบทเปˆเบ™เป†เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™ wrappers เบ‡เปˆเบฒเบเบ”เบฒเบเบžเบปเบšเบ—เบปเปˆเบงเป„เบ›เบ—เบตเปˆ
เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™เบ—เบตเปˆเบˆเบฐเป‚เบ—เบซเบฒ Perl subroutines เปƒเบ™เบเปเบฅเบฐเบ™เบตเบžเบดเป€เบชเบ”. เปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เบกเบทเป‰เบ—เบตเปˆเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบˆเบฐ
เป‚เบ—เบ—เบฑเบ‡เปเบปเบ” call_sv เป€เบžเบทเปˆเบญเป€เบญเบตเป‰เบ™เปƒเบŠเป‰เบงเบฝเบเบเปˆเบญเบ Perl.

เบ—เบฑเบ‡เบซเบกเบปเบ” เป‚เบ—_* เบŸเบฑเบ‡เบŠเบฑเบ™เบกเบต "เบ—เบธเบ‡" เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบœเปˆเบฒเบ™เบซเบ™เป‰เบฒเบเบฒเบเป€เบฅเบฑเบเบ™เป‰เบญเบเบ‚เบญเบ‡
เบ—เบฒเบ‡เป€เบฅเบทเบญเบเปƒเบ™เบเบฒเบ™ Perl. เบซเบ™เป‰เบฒเบเบฒเบเบšเบดเบ”เบ™เบตเป‰เป€เบฎเบฑเบ”เบงเบฝเบเบ„เบทเบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบซเบ™เป‰เบฒเบ—เบตเปˆ. เป„เบ”เป‰
เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™ bit mask เปเบกเปˆเบ™เบชเบปเบ™เบ—เบฐเบ™เบฒเปƒเบ™ "FLAG VALUES".

เปเบ•เปˆเบฅเบฐเบซเบ™เป‰เบฒเบ—เบตเปˆเบˆเบฐเบ–เบทเบเบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเบเบฑเบ™เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™.

call_sv
call_sv เปƒเบŠเป‰เป€เบงเบฅเบฒเบชเบญเบ‡เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™. เบญเบฑเบ™เบ—เปเบฒเบญเบดเบ”, "sv", เปเบกเปˆเบ™ SV*. เบ™เบตเป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบฅเบฐเบšเบธ
Perl subroutine เบ—เบตเปˆเบˆเบฐเบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒเป€เบ›เบฑเบ™ C string (เป€เบŠเบดเปˆเบ‡เบ—เปเบฒเบญเบดเบ”เป„เบ”เป‰เบ–เบทเบเบ›เปˆเบฝเบ™
เป€เบ–เบดเบ‡ SV) เบซเบผเบทเบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡เป€เบ–เบดเบ‡เบฅเบฒเบเบเบฒเบ™เบเปˆเบญเบ. เบžเบฒเบโ€‹เบชเปˆเบงเบ™โ€‹, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ call_sv, เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™
เบชเบฒเบกเบฒเบ” เบ™เบณ เปƒเบŠเป‰ call_sv.

call_pv
เบซเบ™เป‰เบฒโ€‹เบ—เบตเปˆโ€‹, call_pv, เปเบกเปˆเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบš call_sv เบเบปเบเป€เบงเบฑเป‰เบ™เบกเบฑเบ™เบ„เบฒเบ”เบซเบงเบฑเบ‡เบงเปˆเบฒเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบกเบฑเบ™
เป€เบ›เบฑเบ™ C char* เป€เบŠเบดเปˆเบ‡เบเปเบฒเบ™เบปเบ” Perl subroutine เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป‚เบ—เบซเบฒ, เบ•เบปเบงเบขเปˆเบฒเบ‡,
"call_pv("fred", 0)". เบ–เป‰เบฒเบเบฒเบ™เบเปˆเบญเบเบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เป‚เบ—เบซเบฒเบขเบนเปˆเปƒเบ™เบŠเบธเบ”เบญเบทเปˆเบ™, เบžเบฝเบ‡เปเบ•เปˆ
เบฅเบงเบกเป€เบญเบปเบฒเบŠเบทเปˆเปเบžเบฑเบเป€เบเบฑเบ”เบขเบนเปˆเปƒเบ™เบชเบฐเบ•เบฃเบดเบ‡, เบ•เบปเบงเบขเปˆเบฒเบ‡, "pkg::fred".

call_method
เบŸเบฑเบ‡เบŠเบฑเบ™ call_method เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเป‚เบ—เบซเบฒเบงเบดเบ—เบตเบเบฒเบ™เบˆเบฒเบเบซเป‰เบญเบ‡เบฎเบฝเบ™ Perl. เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต
"methname" เบเบปเบ‡เบเบฑเบšเบŠเบทเปˆเบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบญเบตเป‰เบ™เบงเปˆเบฒ. เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบซเป‰เบญเบ‡เบฎเบฝเบ™
เบงเปˆเบฒเบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ‚เบญเบ‡เปเบกเปˆเบ™เบชเบปเปˆเบ‡เบœเปˆเบฒเบ™ Perl stack เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบขเบนเปˆเปƒเบ™เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต
เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ. เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบŠเบทเปˆเบ‚เบญเบ‡เบŠเบฑเป‰เบ™เบฎเบฝเบ™ (เบชเปเบฒเบฅเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ„เบปเบ‡เบ—เบตเปˆ) เบซเบผเบท a
เบญเป‰เบฒเบ‡เบญเบตเบ‡เป€เบ–เบดเบ‡เบงเบฑเบ”เบ–เบธ (เบชเปเบฒเบฅเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™ virtual). เป€เบšเบดเปˆเบ‡ perlobj เบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบš
เบงเบดเบ—เบตเบเบฒเบ™ static เปเบฅเบฐ virtual เปเบฅเบฐ "เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ call_method" เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰
call_method.

call_argv
call_argv เป€เบญเบตเป‰เบ™เบเบฒเบ™เบเบณเบ™เบปเบ”เบเบฒเบ™เบเปˆเบญเบ Perl เป‚เบ”เบเบชเบฒเบ C เบ—เบตเปˆเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™ "เบŠเบทเปˆเบเปˆเบญเบ"
เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต. เบกเบฑเบ™เบเบฑเบ‡เปƒเบŠเป‰เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต "เบ—เบธเบ‡" เบ›เบปเบเบเบฐเบ•เบด. เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบชเบธเบ”เบ—เป‰เบฒเบ, "argv",
เบ›เบฐโ€‹เบเบญเบšโ€‹เบ”เป‰เบงเบโ€‹เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบฅเบฒเบโ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบชเบดเป‰เบ™โ€‹เบชเบธเบ” NULL เบ‚เบญเบ‡โ€‹เบชเบฐโ€‹เบ•โ€‹เบฃเบดเบ‡ C เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบœเปˆเบฒเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบ•เบปเบงโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เบเบฒเบ™โ€‹เบเบฑเบšโ€‹
Perl subroutine. เป€เบšเบดเปˆเบ‡ เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ call_argv.

เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบฑเบ‡เปเบปเบ”เบชเบปเปˆเบ‡เบ„เบทเบ™เบˆเบณเบ™เบงเบ™เป€เบ•เบฑเบก. เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบ™เบฑเบšเบˆเปเบฒเบ™เบงเบ™เบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เป‚เบ”เบ
เบ›เบปเบเบเบฐเบ•เบดเบเปˆเบญเบ Perl. เบฅเบฒเบเบเบฒเบ™เบ•เบปเบงเบˆเบดเบ‡เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เป‚เบ”เบ subroutine เปเบกเปˆเบ™เป€เบเบฑเบšเป„เบงเป‰เปƒเบ™ Perl
เบเบญเบ‡.

เบ•เบฒเบกเบเบปเบ”เบฅเบฐเบšเบฝเบš, เบ—เปˆเบฒเบ™เบ„เบงเบ™ เบชเบฐเป€เบซเบกเบตเป„เบ› เบเบงเบ”เป€เบšเบดเปˆเบ‡เบกเบนเบ™เบ„เปˆเบฒเบเบฑเบšเบ„เบทเบ™เบˆเบฒเบเบŸเบฑเบ‡เบŠเบฑเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ
เบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เบ„เบฒเบ”เบซเบงเบฑเบ‡เบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเบˆเปเบฒเบ™เบงเบ™เบชเบฐเป€เบžเบฒเบฐเบ—เบตเปˆเบˆเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบˆเบฒเบ Perl
subroutine, เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบ—เบตเปˆเบˆเบฐเบขเบธเบ”เบ„เบปเบ™เบˆเบฒเบเบเบฒเบ™เป€เบฎเบฑเบ”เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบšเปเปˆเบ„เบฒเบ”เบ„เบดเบ” - เบขเปˆเบฒเป€เบงเบปเป‰เบฒ
เบ—เปˆเบฒเบ™โ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบ•เบทเบญเบ™โ€‹.

เบ—เบธเบ‡ VALUES


เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™ "เบ—เบธเบ‡" เปƒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ” เป‚เบ—_* เบŸเบฑเบ‡เบŠเบฑเบ™เปœเบถเปˆเบ‡เปƒเบ™ G_VOID, G_SCALAR, เบซเบผเบท G_ARRAY,
เป€เบŠเบดเปˆเบ‡เบŠเบตเป‰เบšเบญเบเป€เบ–เบดเบ‡เบชเบฐเบžเบฒเบšเบเบฒเบ™เบเบฒเบ™เป‚เบ—, OR'ed เบฎเปˆเบงเบกเบเบฑเบšเบซเบ™เป‰เบฒเบเบฒเบเป€เบฅเบฑเบเบ™เป‰เบญเบเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เปƒเบ”เป†
เบชเบฑเบ™เบเบฒเบฅเบฑเบ G_* เบญเบทเปˆเบ™เป†เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰.

G_VOID
เป‚เบ—เบซเบฒเบฅเบฒเบเบเบฒเบ™เบเปˆเบญเบ Perl เปƒเบ™เบšเปเบฅเบดเบšเบปเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เป‚เบกเบ„เบฐ.

เบ—เบธเบ‡เบ™เบตเป‰เบกเบต 2 เบœเบปเบ™เบเบฐเบ—เบปเบš:

1. เบกเบฑเบ™เบŠเบตเป‰เบšเบญเบเป€เบ–เบดเบ‡เบเบฒเบ™เบเบณเบ™เบปเบ”เบเบฒเบ™เบเปˆเบญเบเบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบกเบฑเบ™เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบšเปเบฅเบดเบšเบปเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เป‚เบกเบ„เบฐ
(เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบกเบฑเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹ เบ•เป‰เบญเบ‡เบเบฒเบ™ เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเบฐเป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”).

2. เบกเบฑเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เบˆเบฒเบเบšเบฑเบ™เบŠเบตเบเปˆเบญเบ.

เบ„เปˆเบฒเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เป‚เบ”เบ เป‚เบ—_* เบŸเบฑเบ‡เบŠเบฑเบ™เบŠเบตเป‰เบšเบญเบเบˆเปเบฒเบ™เบงเบ™เบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เป‚เบ”เบ
Perl subroutine - เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™ 0.

G_SCALA
เป‚เบ—เบซเบฒเบฅเบฒเบเบเบฒเบ™เบเปˆเบญเบ Perl เปƒเบ™เบšเปเบฅเบดเบšเบปเบ”เบชเบฐเป€เบเบฑเบ”เป€เบฅเบ. เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบธเบ‡เบšเปเบฅเบดเบšเบปเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™
เบชเบณ เบฅเบฑเบšเบ—เบธเบเบชเบดเปˆเบ‡ เป‚เบ—_* เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบ™เป‰เบฒ.

เบ—เบธเบ‡เบ™เบตเป‰เบกเบต 2 เบœเบปเบ™เบเบฐเบ—เบปเบš:

1. เบกเบฑเบ™เบŠเบตเป‰เบšเบญเบเป€เบ–เบดเบ‡เบเบฒเบ™เบเบณเบ™เบปเบ”เบเบฒเบ™เบเปˆเบญเบเบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบกเบฑเบ™เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบšเปเบฅเบดเบšเบปเบ”เบเบฒเบ™เบชเบฐเป€เบเบฑเบ”เป€เบฅเบ.
(เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบกเบฑเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹ เบ•เป‰เบญเบ‡เบเบฒเบ™ เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเบฐเป€เบ›เบฑเบ™เบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡).

2. เบกเบฑเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆ scalar เบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบงเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เบˆเบฒเบ subroutine. เป„เบ”เป‰
subroutine เบชเบฒเบกเบฒเบ”, เปเบ™เปˆเบ™เบญเบ™, เบšเปเปˆเบชเบปเบ™เปƒเบˆ เบ•เป‰เบญเบ‡เบเบฒเบ™ เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบฅเบฒเบเบŠเบทเปˆเปเบ™เบงเปƒเบ”. เบ–เป‰เบฒโ€‹เบ”เบฑเปˆเบ‡โ€‹เบ™เบฑเป‰เบ™,
เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบฝเบ‡เปเบ•เปˆเบญเบปเบ‡เบ›เบฐเบเบญเบšเบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™.

เบ„เปˆเบฒเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เป‚เบ”เบ เป‚เบ—_* เบŸเบฑเบ‡เบŠเบฑเบ™เบŠเบตเป‰เบšเบญเบเบˆเปเบฒเบ™เบงเบ™เบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เป‚เบ”เบ
Perl subroutine - เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™ 0 เบซเบผเบท 1.

เบ–เป‰เบฒ 0, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เป„เบ”เป‰เบฅเบฐเบšเบธเบ—เบธเบ‡ G_DISCARD.

เบ–เป‰เบฒ 1, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบ•เบปเบงเบˆเบดเบ‡เป‚เบ”เบ Perl subroutine เบˆเบฐเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™ Perl
stack - เบžเบฒเบ เบเบฑเบšเบกเบฒ a เบชเบฐเป€เบเบฅเบฒ เบชเบฐเปเบ”เบ‡เบงเบดเบ—เบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ„เปˆเบฒเบ™เบตเป‰เบขเบนเปˆเปƒเบ™ stack.
เบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒเบšเปเปˆเบงเปˆเบฒเบˆเบฐเป€เบ›เบฑเบ™เบฅเบฒเบเบเบฒเบ™เบเปˆเบญเบเบ‚เบญเบ‡ Perl เป€เบ—เบปเปˆเบฒเปƒเบ”, เบกเบตเบžเบฝเบ‡เปเบ•เปˆเบญเบฑเบ™เบชเบธเบ”เบ—เป‰เบฒเบเป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™
เบˆเบฐเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰เบˆเบฒเบ stack - เบ„เบดเบ”เบงเปˆเบฒเบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบกเบตเบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡เบกเบนเบ™เบ„เปˆเบฒเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เป€เบ›เบฑเบ™
เป€เบ›เบฑเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ—เบตเปˆเบกเบตเบžเบฝเบ‡เปเบ•เปˆเบญเบปเบ‡เบ›เบฐเบเบญเบšเบซเบ™เบถเปˆเบ‡. เบฅเบฒเบเบเบฒเบ™เบญเบทเปˆเบ™เป†เบ—เบตเปˆเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เบˆเบฐเบšเปเปˆเบกเบตเป‚เบ”เบ
เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเป€เบงเบฅเบฒเบเบฑเบšเบ„เบทเบ™เบกเบฒเบˆเบฒเบ เป‚เบ—_* เบซเบ™เป‰เบฒเบ—เบตเปˆ. เบžเบฒเบ เบเบฑเบšเบกเบฒ a เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ in a
เบœเบดเบง เปœเบฑเบ‡ context เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบžเบถเบ”เบ•เบดเบเปเบฒเบ™เบตเป‰.

G_ARRAY
เป‚เบ—เบซเบฒเบฅเบฒเบเบเบฒเบ™เบเปˆเบญเบ Perl เปƒเบ™เบšเปเบฅเบดเบšเบปเบ”เบฅเบฒเบเบเบฒเบ™.

เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบš G_SCALAR, เบ—เบธเบ‡เบ™เบตเป‰เบกเบต 2 เบœเบปเบ™เบเบฐเบ—เบปเบš:

1. เบกเบฑเบ™เบŠเบตเป‰เบšเบญเบเป€เบ–เบดเบ‡เบเบฒเบ™เบเบณเบ™เบปเบ”เบเบฒเบ™เบเปˆเบญเบเบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบกเบฑเบ™เบเปเบฒเบฅเบฑเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบขเบนเปˆเปƒเบ™เบšเปเบฅเบดเบšเบปเบ”เบฅเบฒเบเบเบฒเบ™
(เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบกเบฑเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹ เบ•เป‰เบญเบ‡เบเบฒเบ™ เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเบฐเป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡).

2. เบกเบฑเบ™โ€‹เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰โ€‹เปเบ™เปˆโ€‹เปƒเบˆเบงเปˆโ€‹เบฒโ€‹เบฅเบฒเบโ€‹เบเบฒเบ™โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบเบฑเบšโ€‹เบ„เบทเบ™โ€‹เบกเบฒโ€‹เบˆเบฒเบ subroutine เบˆเบฐโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป€เบ–เบดเบ‡โ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆ
เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฑเบšเบ„เบทเบ™เบˆเบฒเบ เป‚เบ—_* function

เบ„เปˆเบฒเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เป‚เบ”เบ เป‚เบ—_* เบŸเบฑเบ‡เบŠเบฑเบ™เบŠเบตเป‰เบšเบญเบเบˆเปเบฒเบ™เบงเบ™เบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เป‚เบ”เบ
เบ›เบปเบเบเบฐเบ•เบดเบเปˆเบญเบ Perl.

เบ–เป‰เบฒ 0, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เป„เบ”เป‰เบฅเบฐเบšเบธเบ—เบธเบ‡ G_DISCARD.

เบ–เป‰เบฒเบšเปเปˆเปเบกเปˆเบ™ 0, เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบ•เบปเบงเป€เบฅเบเบ‚เบญเบ‡เบˆเปเบฒเบ™เบงเบ™เบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เป‚เบ”เบ subroutine. เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰
เบฅเบฒเบเบเบฒเบ™เบˆเบฐเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™ stack Perl. เบžเบฒเบ เบเบฑเบšเบกเบฒ a เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ of เบ„เปˆเบฒ เปƒเบซเป‰
เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰เบ—เบธเบ‡ G_ARRAY เปเบฅเบฐเบเบปเบ™เป„เบเบ‚เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบˆเบฒเบ
stack Perl.

G_DISCARD
เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, the เป‚เบ—_* เบŸเบฑเบ‡เบŠเบฑเบ™เบˆเบฑเบ”เบงเบฒเบ‡เบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบกเบฒเบˆเบฒเบ routine เบเปˆเบญเบ Perl
stack เป„เบ”เป‰. เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบ—เปˆเบฒเบ™โ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบ„เบงเบฒเบกโ€‹เบชเบปเบ™โ€‹เปƒเบˆโ€‹เปƒเบ™โ€‹เบฅเบฒเบโ€‹เบเบฒเบ™โ€‹เป€เบซเบผเบปเปˆเบฒโ€‹เบ™เบตเป‰โ€‹, เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™โ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ—เบธเบ‡โ€‹เบ™เบตเป‰โ€‹เบˆเบฐโ€‹เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰โ€‹
Perl เบเปเบฒเบˆเบฑเบ”เบžเบงเบเบกเบฑเบ™เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™. เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบกเบฑเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบŠเบตเป‰เบšเบญเบ a
เบšเปเบฅเบดเบšเบปเบ”เบ‚เบญเบ‡เป‚เบ›เบฃเป€เบˆเบฑเบเบเปˆเบญเบ Perl เป‚เบ”เบเปƒเบŠเป‰ G_SCALAR เบซเบผเบท G_ARRAY.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบ•เบฑเป‰เบ‡เบ—เบธเบ‡เบ™เบตเป‰เปเบฅเป‰เบงเบกเบฑเบ™เปเบกเปˆเบ™ เบซเบผเบฒเบ เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเปƒเบ”เบเปเปˆเบ•เบฒเบก
เบŠเบปเปˆเบงเบ„เบฒเบง (เป€เบŠเบฑเปˆเบ™, เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เบตเปˆเบชเบปเปˆเบ‡เป„เบ›เบซเบฒ routine เบเปˆเบญเบ Perl เปเบฅเบฐเบ„เปˆเบฒเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบกเบฒเบˆเบฒเบ
subroutine ) เปเบกเปˆเบ™ disposed เบ‚เบญเบ‡ เบ•เบปเบง เบ—เปˆเบฒเบ™ เป€เบญเบ‡ . เบžเบฒเบ เบเบฑเบšเบกเบฒ a เบชเบฐเป€เบเบฅเบฒ เปƒเบซเป‰เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™
เป€เบžเบทเปˆเบญเบเปเบฒเบˆเบฑเบ”เบเบฒเบ™เบŠเบปเปˆเบงเบ„เบฒเบงเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบขเปˆเบฒเบ‡เบˆเบฐเปเบˆเป‰เบ‡เปเบฅเบฐเบžเบฒเบเบชเปˆเบงเบ™ เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Perl to เบกเบต of
เบŠเบปเปˆเบงเบ„เบฒเบง เบชเบปเบ™เบ—เบฐเบ™เบฒเบเปˆเบฝเบงเบเบฑเบšเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบชเบฐเป€เบžเบฒเบฐเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบšเปเปˆเบชเบปเบ™เปƒเบˆเบšเบฑเบ™เบซเบฒเปเบฅเบฐเบ›เปˆเบญเบเปƒเบซเป‰
Perl เบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบกเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™.

G_NOARGS
เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆ routine เบเปˆเบญเบ Perl เบ–เบทเบเป€เบญเบตเป‰เบ™เปƒเบŠเป‰เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡ เป‚เบ—_* เบซเบ™เป‰เบฒเบ—เบตเปˆ, เบกเบฑเบ™เปเบกเปˆเบ™เบชเบปเบกเบกเบธเบ”เบ•เบดเบ–เบฒเบ™เป‚เบ”เบ
เบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เบตเปˆเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบเบฑเบš routine เบเปˆเบญเบ. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเป„เบ”เป‰เบœเปˆเบฒเบ™เปƒเบ”เป†
เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบเบฑเบš Perl subroutine, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบซเบเบฑเบ”เป€เบงเบฅเบฒเป€เบฅเบฑเบเบ™เป‰เบญเบเป‚เบ”เบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบธเบ‡เบ™เบตเป‰. เบกเบฑเบ™
เบกเบตเบœเบปเบ™เบเบฐเบ—เบปเบšเบ‚เบญเบ‡เบเบฒเบ™เบšเปเปˆเบชเป‰เบฒเบ‡ @_ array เบชเปเบฒเบฅเบฑเบš Perl subroutine.

เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เป‚เบ”เบเบ—เบธเบ‡เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบเบปเบ‡เป„เบ›เบเบปเบ‡เบกเบฒ, เบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเป€เบ›เบฑเบ™
เปƒเบŠเป‰เบžเบฝเบ‡เปเบ•เปˆเบ–เป‰เบฒเบกเบตเป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เปเบ™เบงเบ™เบฑเป‰เบ™. เป€เบซเบ”เบœเบปเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบฐเบกเบฑเบ”เบฅเบฐเบงเบฑเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ
เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป„เบ”เป‰เบฅเบฐเบšเบธเบ—เบธเบ‡ G_NOARGS, เบกเบฑเบ™เบเบฑเบ‡เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเปˆเบญเบ Perl เบ—เบตเปˆ
เป„เบ”เป‰เบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบ„เบดเบ”เบงเปˆเบฒเบ—เปˆเบฒเบ™เป„เบ”เป‰เบœเปˆเบฒเบ™เบกเบฑเบ™เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™.

เปƒเบ™โ€‹เบ„เบงเบฒเบกโ€‹เป€เบ›เบฑเบ™โ€‹เบˆเบดเบ‡, เบชเบดเปˆเบ‡โ€‹เบ—เบตเปˆโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป€เบเบตเบ”โ€‹เบ‚เบถเป‰เบ™โ€‹เปเบกเปˆเบ™โ€‹เบงเปˆเบฒ subroutine Perl เบ—เบตเปˆโ€‹เบ—เปˆเบฒเบ™โ€‹เป„เบ”เป‰โ€‹เป€เบญเบตเป‰เบ™โ€‹เบงเปˆเบฒโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป€เบ–เบดเบ‡ @_
array เบˆเบฒเบ routine เบเปˆเบญเบ Perl เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ. เบ™เบตเป‰เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบเปเบฒเบฅเบฑเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”
เป„เบ”เป‰ เป‚เบ—_* เบŸเบฑเบ‡เบŠเบฑเบ™เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เป„เบ”เป‰เบ–เบทเบเป€เบญเบตเป‰เบ™เบˆเบฒเบเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเปˆเบญเบ Perl เบญเบทเปˆเบ™. เบฅเบฐเบซเบฑเบ”เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰
เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบ™เบตเป‰

เบเปˆเบญเบ fred
{ เบžเบดเบก "@_\n" }

sub joe
{ &fred }

&jo(1,2,3);

เบ™เบตเป‰เบˆเบฐเบžเบดเบก

+1 2 3

เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปเบกเปˆเบ™เบงเปˆเบฒ "fred" เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ @_ array เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบ‚เบญเบ‡ "joe".

G_EVAL
เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบชเปเบฒเบฅเบฑเบš subroutine Perl เบ—เบตเปˆเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เป‚เบ—เบซเบฒเป€เบžเบทเปˆเบญเบขเบธเบ”เบเบฒเบ™เบœเบดเบ”เบ›เบปเบเบเบฐเบ•เบด, เบ•เบปเบงเบขเปˆเบฒเบ‡, เป‚เบ”เบ.
เป‚เบ—เบซเบฒ เป„เบ”เป‰ เบขเปˆเบฒเบ‡เบˆเบฐเปเบˆเป‰เบ‡ เบซเบผเบทเบšเปเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง. เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เป€เบกเบทเปˆเบญเบ—เบฑเบ‡เบชเบญเบ‡เบญเบฑเบ™เบ™เบตเป‰
เป€เบซเบ”เบเบฒเบ™เป€เบเบตเบ”เบ‚เบทเป‰เบ™, เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบˆเบฐเบขเบธเบ”เบ•เบดเบ—เบฑเบ™เบ—เบต. เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเปƒเบชเปˆเบเบฑเบšเบ”เบฑเบเบ›เบฐเป€เบžเบ”เบ™เบตเป‰
เป€เบซเบ”เบเบฒเบ™, เบฅเบฐเบšเบธเบ—เบธเบ‡ G_EVAL. เบกเบฑเบ™เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบ›เบฑเบ™ เบเบฒเบ™เบ›เบฐเป€เบกเบตเบ™ { } เบ›เบฐเบกเบฒเบ™เบเบฒเบ™เป‚เบ—เปเบšเบšเบ›เบปเบเบเบฐเบ•เบด.

เป€เบกเบทเปˆเบญเปƒเบ”เบเปเปˆเบ•เบฒเบกเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฑเบšเบ„เบทเบ™เบกเบฒเบˆเบฒเบ เป‚เบ—_* เบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบเบงเบ”เป€เบšเบดเปˆเบ‡เบ•เบปเบงเปเบ› $@ เบ•เบฒเบกเบ—เบตเปˆเบ—เปˆเบฒเบ™
เบˆเบฐเบขเบนเปˆเปƒเบ™เบชเบฐเบ„เบดเบš Perl เบ›เบปเบเบเบฐเบ•เบด.

เบ„เปˆเบฒเบเบฑเบšเบ„เบทเบ™เบˆเบฒเบ เป‚เบ—_* เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเบ—เบธเบ‡เบญเบทเปˆเบ™เป†เป„เบ”เป‰
เบฅเบฐเบšเบธ เปเบฅเบฐเบงเปˆเบฒเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เป€เบเบตเบ”เบ‚เบถเป‰เบ™เบซเบผเบทเบšเปเปˆ. เบ™เบตเป‰เปเบกเปˆเบ™เบ—เบธเบเบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰
เป€เบเบตเบ”:

ยทเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒ เป‚เบ—_* function เบเบฑเบšเบ„เบทเบ™เบกเบฒเบ•เบฒเบกเบ›เบปเบเบเบฐเบ•เบด, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เปเบกเปˆเบ™เบ•เบฒเบกเบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™
เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ.

ยท เบ–เป‰เบฒ G_DISCARD เบ–เบทเบเบฅเบฐเบšเบธ, เบ„เปˆเบฒเบเบฑเบšเบ„เบทเบ™เบˆเบฐเป€เบ›เบฑเบ™ 0 เบชเบฐเป€เปเบต.

ยท เบ–เป‰เบฒ G_ARRAY เบ–เบทเบเบฅเบฐเบšเบธ เปเบฅเบฐ เบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เป€เบเบตเบ”เบ‚เบถเป‰เบ™, เบ„เปˆเบฒเบเบฑเบšเบ„เบทเบ™เบˆเบฐเป€เบ›เบฑเบ™ 0 เบชเบฐเป€เปเบต.

ยท เบ–เป‰เบฒ G_SCALAR เบ–เบทเบเบฅเบฐเบšเบธ เปเบฅเบฐ เบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เป€เบเบตเบ”เบ‚เบถเป‰เบ™, เบ„เปˆเบฒเบเบฑเบšเบ„เบทเบ™เบˆเบฐเป€เบ›เบฑเบ™ 1 เปเบฅเบฐ
เบกเบนเบ™เบ„เปˆเบฒเบขเบนเปˆเป€เบ—เบดเบ‡เบชเบธเบ”เบ‚เบญเบ‡ stack เบˆเบฐเป€เบ›เบฑเบ™ undef. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเปเบฅเป‰เบง
เบเบงเบ”เบžเบปเบšเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เป‚เบ”เบเบเบฒเบ™เบเบงเบ”เบชเบญเบš $@ เปเบฅเบฐเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบซเป‰เป‚เบ„เบ‡เบเบฒเบ™เบชเบทเบšเบ•เปเปˆ, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡
เบˆเบทเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบ›เบฒเบเบปเบ” undef เบˆเบฒเบ stack เป„เบ”เป‰.

เป€เบšเบดเปˆเบ‡ เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ G_EVAL เบชเปเบฒเบฅเบฑเบšเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ G_EVAL.

G_KEEPERR
เบเบฒเบ™เปƒเบŠเป‰เบ—เบธเบ‡ G_EVAL เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบˆเบฐเบ•เบฑเป‰เบ‡ $@ เบชเบฐเป€เปเบต: เบเบฒเบ™เบฅเป‰เบฒเบ‡เบกเบฑเบ™เบ–เป‰เบฒเบšเปเปˆเบกเบต
error, เปเบฅเบฐเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบกเบฑเบ™เป€เบžเบทเปˆเบญเบญเบฐเบ—เบดเบšเบฒเบเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบกเบตเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบฅเบฐเบซเบฑเบ”เป€เบญเบตเป‰เบ™เบงเปˆเบฒ.
เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบ„เบงเบฒเบกเบ•เบฑเป‰เบ‡เปƒเบˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰, เปเบ•เปˆเบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบ—เปˆเบฒเบ™
เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเปƒเบชเปˆเบเบฑเบšเบ”เบฑเบเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบฅเบฐเบขเบธเบ”เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเปเบŠเบเปเบŠเบ‡เบเบฑเบšเบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™.

เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ™เบตเป‰เบชเปˆเบงเบ™เบซเบผเบฒเบเปเบกเปˆเบ™เปƒเบŠเป‰เป„เบ”เป‰เบเบฑเบšเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบซเบกเบฒเบเป€เบ–เบดเบ‡เบเบฒเบ™เป‚เบ—เบซเบฒเบˆเบฒเบเบžเบฒเบเปƒเบ™
เบ•เบปเบงเบ—เบณเบฅเบฒเบ, เป‚เบ—เบเบฑเบšเบ„เบทเบ™เปเบšเบšเบšเปเปˆเบเบปเบ‡เบเบฑเบ™, เปเบฅเบฐเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบชเบฑเบ™เบเบฒเบ™. เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบšเปˆเบญเบ™เบ—เบตเปˆ
เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ–เบทเบเป€เบญเบตเป‰เบ™เบกเบตเบ„เบงเบฒเบกเบชเปเบฒเบžเบฑเบ™เบซเบ™เป‰เบญเบเบเบฑเบšเบชเบฐเบžเบฒเบšเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบญเป‰เบญเบกเบ‚เป‰เบฒเบ‡, เป‚เบ„เบ‡เบเบฒเบ™เบ•เบปเป‰เบ™เบ•เป
เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™ insulated เบˆเบฒเบเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบเบฒเบ™เป„เบ”เป‰
เบขเปˆเบฒเบ‡เบชเบฐเบซเบผเบฒเบ”. เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰เบ”เป‰เบงเบเบฅเบฐเบซเบฑเบ” "__DIE__" เบซเบผเบท "__WARN__"
hooks, เปเบฅเบฐเบซเบ™เป‰เบฒเบ—เบตเปˆ "tie".

เบ—เบธเบ‡ G_KEEPERR เปเบกเปˆเบ™เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบฎเปˆเบงเบกเบเบฑเบš G_EVAL เปƒเบ™ เป‚เบ—_* เบซเบ™เป‰เบฒเบ—เบตเปˆ
เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบฅเบฐเบซเบฑเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบซเบผเบทเบเบฑเบš "eval_sv". เบ—เบธเบ‡เบ™เบตเป‰เบšเปเปˆเบกเบตเบœเบปเบ™เบ•เปเปˆ
"call_*" เบŸเบฑเบ‡เบŠเบฑเบ™เป€เบกเบทเปˆเบญ G_EVAL เบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰.

เป€เบกเบทเปˆเบญ G_KEEPERR เบ–เบทเบเปƒเบŠเป‰, เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เปƒเบ”เป†เปƒเบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ–เบทเบเป€เบญเบตเป‰เบ™เบˆเบฐเบขเบธเบ”เบเบฒเบ™เป‚เบ—เบ•เบฒเบกเบ›เบปเบเบเบฐเบ•เบด, เปเบฅเบฐ
เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹เบˆเบฐโ€‹เบšเปเปˆโ€‹เปเบœเปˆโ€‹เบ‚เบฐโ€‹เบซเบเบฒเบโ€‹เบ™เบญเบโ€‹เป€เบซเบ™เบทเบญโ€‹เบเบฒเบ™โ€‹เป‚เบ— (เบ•เบฒเบกโ€‹เบ›เบปเบโ€‹เบเบฐโ€‹เบ•เบดโ€‹เบชเปเบฒโ€‹เบฅเบฑเบš G_EVALโ€‹)โ€‹, เปเบ•เปˆโ€‹เบงเปˆเบฒโ€‹เบกเบฑเบ™โ€‹เบˆเบฐโ€‹เบšเปเปˆโ€‹เป„เบ›โ€‹
เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ $@. เปเบ—เบ™เบ—เบตเปˆเบˆเบฐ, เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบˆเบฐเบ–เบทเบเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™เบ„เปเบฒเป€เบ•เบทเบญเบ™, เปเบ—เบ™เบ—เบตเปˆเบ”เป‰เบงเบเบชเบฐเบ•เบฃเบดเบ‡
"\t (เบขเบนเปˆเปƒเบ™เบเบฒเบ™เบ—เปเบฒเบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ”)". เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ›เบดเบ”เปƒเบŠเป‰เบ‡เบฒเบ™เป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰ "เบšเปเปˆเบกเบตเบ„เปเบฒเป€เบ•เบทเบญเบ™ 'misc'". เบ–เป‰เบฒเบšเปเปˆเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”,
$@ เบˆเบฐเบšเปเปˆเบ–เบทเบเบฅเบถเบšเบฅเป‰เบฒเบ‡.

เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบ—เบธเบ‡ G_KEEPERR เบšเปเปˆเป„เบ”เป‰เปเบœเปˆเบ‚เบฐเบซเบเบฒเบเป„เบ›เบชเบนเปˆ evaals เบžเบฒเบเปƒเบ™; เบชเบดเปˆเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบเบฑเบ‡เบ•เบฑเป‰เบ‡ $@.

เบ—เบธเบ‡ G_KEEPERR เบ–เบทเบเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเปƒเบ™ Perl เบฎเบธเปˆเบ™ 5.002.

เป€เบšเบดเปˆเบ‡ เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ G_KEEPERR เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ—เบธเบ‡เบ™เบตเป‰.

เบเบฒเบ™ เบเบณ เบ™เบปเบ” เป„เบ”เป‰ Context
เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเบกเบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบชเบฐเบžเบฒเบšเบเบฒเบ™เบ‚เบญเบ‡ subroutine เบ—เบตเปˆเบเปเบฒเบฅเบฑเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เบขเบนเปˆเปƒเบ™
Perl เบเบฑเบš เบ•เป‰เบญเบ‡เบเบฒเบ™. เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ—เบฝเบšเป€เบ—เบปเปˆเบฒเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เปƒเบ™ C เป‚เบ”เบเปƒเบŠเป‰เบกเบฐเบซเบฒเบžเบฒเบ "GIMME_V",
เป€เบŠเบดเปˆเบ‡เปƒเบซเป‰เบœเบปเบ™เบ•เบญเบšเปเบ—เบ™ "G_ARRAY" เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ–เบทเบเป€เบญเบตเป‰เบ™เปƒเบ™เบšเปเบฅเบดเบšเบปเบ”เบฅเบฒเบเบเบฒเบ™, "G_SCALAR" เบ–เป‰เบฒเบขเบนเปˆเปƒเบ™
context scalar, เบซเบผเบท "G_VOID" เบ–เป‰เบฒเบขเบนเปˆเปƒเบ™เบšเปเบฅเบดเบšเบปเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เป‚เบกเบ„เบฐ (เป€เบŠเบฑเปˆเบ™, เบ„เปˆเบฒเบเบฑเบšเบ„เบทเบ™เบˆเบฐเบšเปเปˆเป€เบ›เบฑเบ™.
เปƒเบŠเป‰). เบฎเบธเปˆเบ™เป€เบเบปเปˆเบฒเบ‚เบญเบ‡เบกเบฐเบซเบฒเบžเบฒเบเบ™เบตเป‰เป€เบญเบตเป‰เบ™เบงเปˆเบฒ "GIMME"; เปƒเบ™เบšเปเบฅเบดเบšเบปเบ”เบ—เบตเปˆเบšเปเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”เบกเบฑเบ™เบเบฑเบšเบ„เบทเบ™เบกเบฒ
"G_SCALAR" เปเบ—เบ™ "G_VOID". เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ "GIMME_V" macro เปเบกเปˆเบ™เบชเบฐเปเบ”เบ‡เบขเบนเปˆเปƒเบ™
เบชเปˆเบงเบ™ เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ GIMME_V.

เบ•เบปเบงเบขเปˆเบฒเบ‡


เบžเบฝเบ‡โ€‹เบžเปโ€‹เบ‚เบญเบ‡โ€‹เบ„เปเบฒโ€‹เบ™เบดโ€‹เบเบฒเบกโ€‹เป€เบงเบปเป‰เบฒโ€‹! เบ‚เปโ€‹เปƒเบซเป‰โ€‹เบกเบตโ€‹เบšเบฒเบ‡โ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹.

Perl เบชเบฐเบซเบ™เบญเบ‡ macro เบซเบผเบฒเบเป€เบžเบทเปˆเบญเบŠเปˆเบงเบเปƒเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ Perl stack. เบšเปˆเบญเบ™เปƒเบ”เบเปเปˆเบ•เบฒเบกเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰, เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰
macros เบ„เบงเบ™เบ–เบทเบเปƒเบŠเป‰เบ•เบฐเบซเบผเบญเบ”เป€เบงเบฅเบฒเป€เบกเบทเปˆเบญเบ•เบดเบ”เบ•เปเปˆเบเบฑเบš Perl เบžเบฒเบเปƒเบ™. เบžเบงเบเป€เบฎเบปเบฒเบซเบงเบฑเบ‡เบงเปˆเบฒเบ™เบตเป‰เบ„เบงเบ™เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰
เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบชเปˆเบฝเบ‡เบซเบ™เป‰เบญเบเบ•เปเปˆเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ”เป†เบ•เปเปˆ Perl เปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”.

เบˆเบธเบ”เบ—เบตเปˆเบ„เบงเบ™เบชเบฑเบ‡เป€เบเบ”เบญเบตเบเบขเปˆเบฒเบ‡เบซเบ™เบถเปˆเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเปƒเบ™เบŠเบธเบ”เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ™เปเบฒเปƒเบŠเป‰เบžเบฝเบ‡เปเบ•เปˆ
เป„เบ”เป‰ call_pv เบซเบ™เป‰เบฒเบ—เบตเปˆ. เบ™เบตเป‰เป„เบ”เป‰เบ–เบทเบเป€เบฎเบฑเบ”เป€เบžเบทเปˆเบญเบฎเบฑเบเบชเบฒเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ‡เปˆเบฒเบเบเบงเปˆเบฒเปเบฅเบฐเบชเบฐเบ”เบงเบเบชเบฐเบšเบฒเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™
เบซเบปเบงเบ‚เปเป‰. เบšเปˆเบญเบ™เปƒเบ”เบเปเปˆเบ•เบฒเบกเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰, เบ–เป‰เบฒเบ—เบฒเบ‡เป€เบฅเบทเบญเบเปเบกเปˆเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ call_pv เปเบฅเบฐ call_sv, เป€เบˆเบปเป‰เบฒโ€‹เบ„เบงเบ™
เบžเบฐเบเบฒเบเบฒเบกเปƒเบŠเป‰เบขเบนเปˆเบชเบฐ เป€เปเบต call_sv, เบ—เบฐเป€เบฅเบชเบฒเบš เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ call_sv เบชเปเบฒเบฅเบฑเบšเบฅเบฒเบเบฅเบฐเบญเบฝเบ”.

No เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต, เบšเปเปˆเบกเบตเบซเบเบฑเบ‡ เบเบฑเบšเบกเบฒเปเบฅเป‰เบง
เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบเบญเบฑเบ™เบ—เปเบฒเบญเบดเบ”เบ™เบตเป‰เบˆเบฐเป‚เบ—เบซเบฒเบเบฒเบ™เบเปˆเบญเบ Perl, PrintUID, เป€เบžเบทเปˆเบญเบžเบดเบกเบญเบญเบ UID เบ‚เบญเบ‡
เบ‚เบฐเบšเบงเบ™เบเบฒเบ™.

เบเปˆเบญเบ PrintUID
{
เบžเบดเบก "UID เปเบกเปˆเบ™ $<\n";
}

เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบŸเบฑเบ‡เบŠเบฑเบ™ C เป€เบžเบทเปˆเบญเป‚เบ—เบซเบฒเบกเบฑเบ™

void static
call_PrintUID()
{
dSP;

PUSHMARK(SP);
call_pv("PrintUID", G_DISCARD|G_NOARGS);
}

เบ‡เปˆเบฒเบเบ”เบฒเบ, eh?

เบšเบฒเบ‡เบˆเบธเบ”เบ—เบตเปˆเบ„เบงเบ™เบชเบฑเบ‡เป€เบเบ”เบเปˆเบฝเบงเบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰:

1. เบšเปเปˆเบชเบปเบ™เปƒเบˆ "dSP" เปเบฅเบฐ "PUSHMARK(SP)" เบชเปเบฒเบฅเบฑเบšเบ•เบญเบ™เบ™เบตเป‰. เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ•เปเปˆเป„เบ›.

2. เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เบœเปˆเบฒเบ™เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เปƒเบ”เป† PrintUID เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ G_NOARGS เบชเบฒเบกเบฒเบ”เบ–เบทเบเบเปเบฒเบ™เบปเบ”.

3. เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบชเบปเบ™เปƒเบˆเบซเบเบฑเบ‡เบเบฑเบšเบ„เบทเบ™เบกเบฒเบˆเบฒเบ PrintUID, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ G_DISCARD เบ–เบทเบเบฅเบฐเบšเบธ.
เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒ PrintUID เบ–เบทเบเบ›เปˆเบฝเบ™เป€เบžเบทเปˆเบญเบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เปˆเบฒเบšเบฒเบ‡เบขเปˆเบฒเบ‡, เป‚เบ”เบเบฅเบฐเบšเบธ G_DISCARD เบˆเบฐ
เบซเบกเบฒเบ เบ„เบงเบฒเบก เบงเปˆเบฒ เบžเบงเบ เป€เบ‚เบปเบฒ เป€เบˆเบปเป‰เบฒ เบˆเบฐ เป„เบ”เป‰ เบฎเบฑเบš เบเบฒเบ™ wiped เป‚เบ”เบ เบเบฒเบ™ เบ„เบงเบš เบ„เบธเบก เบ—เบตเปˆ เปƒเบŠเป‰ เป€เบง เบฅเบฒ เบเบฑเบš เบ„เบทเบ™ เบกเบฒ เบˆเบฒเบ call_pv.

เบ›เบต 4. เบ”เบฑเปˆเบ‡ call_pv เบเปเบฒเบฅเบฑเบ‡เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰, Perl subroutine เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป€เบ›เบฑเบ™ C string. เปƒเบ™โ€‹เบ™เบตเป‰
เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ—เบตเปˆโ€‹เบŠเบทเปˆ subroutine เป„เบ”เป‰ 'hard-wired' เป€เบ‚เบปเป‰เบฒโ€‹เป„เบ›โ€‹เปƒเบ™โ€‹เบฅเบฐโ€‹เบซเบฑเบ”โ€‹.

5. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ” G_DISCARD, เบกเบฑเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบเบงเบ”เป€เบšเบดเปˆเบ‡เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบˆเบฒเบ
call_pv. เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™ 0 เบชเบฐเป€เปเบต.

Passing เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™
เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบเบงเปˆเบฒเป€เบฅเบฑเบเบ™เป‰เบญเบ. เป€เบงเบฅเบฒเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เป‚เบ—เบซเบฒ Perl
subroutine, "LeftString", เป€เบŠเบดเปˆเบ‡เบˆเบฐเปƒเบŠเป‰เป€เบงเบฅเบฒ 2 เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™ - a string ($s) เปเบฅเบฐ integer ($n).
เบฅเบฒเบเบเบฒเบ™เบเปˆเบญเบเบˆเบฐเบžเบดเบกเบ•เบปเบงเบญเบฑเบเบชเบญเบ™ $n เบ—เบณเบญเบดเบ”เบ‚เบญเบ‡เบชเบฐเบ•เบฃเบดเบ‡.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ routine เบเปˆเบญเบ Perl เบˆเบฐเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ™เบตเป‰:

เบเปˆเบญเบ LeftString
{
my($s, $n) = @_;
เบžเบดเบกเบเปˆเบญเบ ($s, 0, $n), "\n";
}

เบŸเบฑเบ‡เบŠเบฑเบ™ C เบ•เป‰เบญเบ‡เบเบฒเบ™เป‚เบ—เบซเบฒ เป€เบชเบฑเป‰เบ™เบŠเป‰เบฒเบ เบˆเบฐโ€‹เป€เบšเบดเปˆเบ‡โ€‹เบ„เบทโ€‹เบ™เบตเป‰โ€‹:

void static
call_LeftString(a, b)
char * a ;
int b;
{
dSP;

ENTER;
SAVETMPS;

PUSHMARK(SP);
XPUSHs(sv_2mortal(newSVpv(a, 0)));
XPUSHs(sv_2mortal(newSViv(b)));
PUTBACK;

call_pv("LeftString", G_DISCARD);

FREETMPS;
เบญเบญเบเบˆเบฒเบ;
}

เบ™เบตเป‰เปเบกเปˆเบ™เบšเบฑเบ™เบ—เบถเบเบชเบญเบ‡เบชเบฒเบกเบขเปˆเบฒเบ‡เบเปˆเบฝเบงเบเบฑเบšเบŸเบฑเบ‡เบŠเบฑเบ™ C call_LeftString.

1. เบžเบฒเบฃเบฒเบกเบดเป€เบ•เบตเบ–เบทเบเบชเบปเปˆเบ‡เบ•เปเปˆเป„เบ›เบซเบฒ routine เบเปˆเบญเบ Perl เป‚เบ”เบเปƒเบŠเป‰ Perl stack. เบ™เบตเป‰โ€‹เปเบกเปˆเบ™
เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเป€เบชเบฑเป‰เบ™ "dSP" เปเบฅเบฐเบชเบดเป‰เบ™เบชเบธเบ”เบ”เป‰เบงเบเป€เบชเบฑเป‰เบ™ "PUTBACK".
"dSP" เบ›เบฐเบเบฒเบ”เบชเปเบฒเป€เบ™เบปเบฒเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ‚เบญเบ‡เบ•เบปเบงเบŠเบตเป‰ stack. เบชเปเบฒเป€เบ™เบปเบฒเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ™เบตเป‰เบ„เบงเบ™ เบชเบฐเป€เบซเบกเบตเป„เบ›
เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป€เบ›เบฑเบ™ "SP".

2. เบ–เป‰เบฒเป€เบˆเบปเป‰เบฒเบˆเบฐเป€เบญเบปเบฒเบญเบฑเบ™เปƒเบ”เบญเบฑเบ™เปœเบถเปˆเบ‡เปƒเบชเปˆเปƒเบชเปˆ Perl stack, เป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เบฎเบนเป‰เบงเปˆเบฒเบˆเบฐเปƒเบชเปˆเบšเปˆเบญเบ™เปƒเบ”
เบกเบฑเบ™. เบ™เบตเป‰เปเบกเปˆเบ™เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡เบกเบฐเบซเบฒเบžเบฒเบ "dSP"--เบกเบฑเบ™เบ›เบฐเบเบฒเบ” เปเบฅเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ a เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™ เบ„เบฑเบ”เบฅเบญเบ
เบ‚เบญเบ‡เบ•เบปเบงเบŠเบตเป‰ Perl stack.

เบกเบฐเบซเบฒเบžเบฒเบเบญเบทเปˆเบ™เป†เบ—เบฑเบ‡เปเบปเบ”เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰เบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบซเป‰เบ—เปˆเบฒเบ™เปƒเบŠเป‰เบญเบฑเบ™เบ™เบตเป‰
เบกเบฐเบซเบฒเบžเบฒเบ.

เบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™เบ‚เบญเบ‡เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ™เบตเป‰เปเบกเปˆเบ™เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เป‚เบ—เบซเบฒ subroutine Perl เป‚เบ”เบเบเบปเบ‡เบˆเบฒเบ an
เบŸเบฑเบ‡เบŠเบฑเบ™ XSUB. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบกเบฑเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰ "dSP" macro เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™ - เบกเบฑเบ™
เบˆเบฐเบ–เบทเบเบ›เบฐเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”.

3. เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เปƒเบ”เป†เบ—เบตเปˆเบˆเบฐ pushed เปƒเบชเปˆ stack เบ„เบงเบ™เบ–เบทเบเบเบถเบ”เป‚เบ”เบ "PUSHMARK" เปเบฅเบฐ.
"PUTBACK" เบกเบฐเบซเบฒเบžเบฒเบ. เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡เบ—เบฑเบ‡เบชเบญเบ‡เบกเบฐเบซเบฒเบžเบฒเบ, เปƒเบ™เบชเบฐเบžเบฒเบšเบเบฒเบ™เบ™เบตเป‰, เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบ™เบฑเบš
เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เบŠเบธเบเบเบนเป‰เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆ Perl เบเปเบฒเบฅเบฑเบ‡เบชเป‰เบฒเบ‡
array @_ เบชเปเบฒเบฅเบฑเบš routine เบเปˆเบญเบ, เบกเบฑเบ™เบฎเบนเป‰เบงเปˆเบฒเบกเบฑเบ™เปƒเบซเบเปˆเบ›เบฒเบ™เปƒเบ”.

เบกเบฐเบซเบฒเบžเบฒเบ "PUSHMARK" เบšเบญเบ Perl เปƒเบซเป‰เบšเบฑเบ™เบ—เบถเบเบˆเบดเบ”เปƒเบˆเบ‚เบญเบ‡เบ•เบปเบงเบŠเบตเป‰ stack เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™.
เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ—เปˆเบฒเบ™เบˆเบฐเบšเปเปˆเป„เบ”เป‰เบœเปˆเบฒเบ™เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เปƒเบ”เป† (เป€เบŠเบฑเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบชเบฐเปเบ”เบ‡เบขเบนเปˆเปƒเบ™เบžเบฒเบ No
เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต, เบšเปเปˆเบกเบตเบซเบเบฑเบ‡ เบเบฑเบšเบกเบฒเปเบฅเป‰เบง) เบ—เปˆเบฒเบ™เบเบฑเบ‡เบ•เป‰เบญเบ‡เป‚เบ—เบซเบฒ "PUSHMARK" macro เบเปˆเบญเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเบฐเบชเบฒเบกเบฒเบ”
เป‚เบ—เบซเบฒเปƒเบ”เป†เบ‚เบญเบ‡ เป‚เบ—_* functions--Perl เบเบฑเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เบฎเบนเป‰เบงเปˆเบฒเบšเปเปˆเบกเบต
เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™.

เบกเบฐเบซเบฒเบžเบฒเบ "PUTBACK" เบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบชเปเบฒเป€เบ™เบปเบฒเบ—เบปเปˆเบงเป‚เบฅเบเบ‚เบญเบ‡เบ•เบปเบงเบŠเบตเป‰ stack เบ„เบทเบเบฑเบ™เบเบฑเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ
เบชเบณเป€เบ™เบปเบฒเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™. เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, call_pv เบˆเบฐเบšเปเปˆเบฎเบนเป‰เบงเปˆเบฒเบชเบญเบ‡เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒ
pushed were-- เบˆเบปเปˆเบ‡เบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒเบกเบฒเบฎเบญเบ”เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบเบฒเบ™เบซเบกเบนเบ™เปƒเบŠเป‰เบ•เบปเบงเบŠเบตเป‰ stack เบ—เบฑเบ‡เปเบปเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบฎเบฑเบ”เปเบฅเป‰เบง
เปเบกเปˆเบ™โ€‹เบเบฑเบšโ€‹เบชเปเบฒโ€‹เป€เบ™เบปเบฒโ€‹เบ—เป‰เบญเบ‡โ€‹เบ–เบดเปˆเบ™โ€‹เบ‚เบญเบ‡โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹, เบšเปเปˆ เบชเปเบฒเป€เบ™เบปเบฒเบ—เบปเปˆเบงเป‚เบฅเบ.

4. เบ•เปเปˆเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเบกเบฒ XPUSHs. เบ™เบตเป‰เปเบกเปˆเบ™เบšเปˆเบญเบ™เบ—เบตเปˆเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ•เบปเบงเบˆเบดเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™ pushed เปƒเบชเปˆ
stack. เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ™เบตเป‰โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบเปเบฒโ€‹เบฅเบฑเบ‡โ€‹เบŠเบธเบโ€‹เบ”เบฑเบ™โ€‹เปƒเบซเป‰โ€‹เบชเบฐโ€‹เบ•โ€‹เบฃเบดเบ‡โ€‹เปเบฅเบฐโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เป€เบ•เบฑเบกโ€‹.

เป€เบšเบดเปˆเบ‡ "XSUBs เปเบฅเบฐ Argument Stack" เปƒเบ™ perlguts เบชเปเบฒเบฅเบฑเบšเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™ Macros XPUSH
เป€เบฎเบฑเบ”เบงเบฝเบ.

5. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบ„เบธเบ™เบ„เปˆเบฒเบŠเบปเปˆเบงเบ„เบฒเบง (เป‚เบ”เบเบงเบดเบ—เบตเบเบฒเบ™ sv_2mortal() เป‚เบ—) เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เป‰เบญเบ‡
เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰โ€‹เบเบฐโ€‹เบ—เบฑเบ”โ€‹เบฎเบฑเบ”โ€‹เป€เบ–เบดเบ‡ stack Perl เปเบฅเบฐโ€‹เบเปเบฒโ€‹เบˆเบฑเบ”โ€‹เบ‚เบญเบ‡ SVs เบกเบฐโ€‹เบ•เบฐโ€‹.

เบ™เบตเป‰เปเบกเปˆเบ™เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡

ENTER;
SAVETMPS;

เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆ, เปเบฅเบฐ

FREETMPS;
เบญเบญเบเบˆเบฒเบ;

เปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบ. เบ„เบนเปˆ "ENTER"/"SAVETMPS" เบชเป‰เบฒเบ‡เบ‚เบญเบšเป€เบ‚เบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบŠเบปเปˆเบงเบ„เบฒเบงเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒ
เบชเป‰เบฒเบ‡. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบเบฒเบ™เบŠเบปเปˆเบงเบ„เบฒเบงเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเปเบฒเบˆเบฑเบ”เบˆเบฐเบˆเปเบฒเบเบฑเบ”เบžเบฝเบ‡เปเบ•เปˆเบชเบดเปˆเบ‡เบ—เบตเปˆ
เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เป‚เบ—เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰.

เบ„เบนเปˆ "FREETMPS"/"LEAVE" เบˆเบฐเบเปเบฒเบˆเบฑเบ”เบ„เปˆเบฒเปƒเบ”เป†เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เป‚เบ”เบ Perl
subroutine (เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ•เปเปˆเป„เบ›), เบšเบงเบเบเบฑเบšเบกเบฑเบ™เบเบฑเบ‡เบˆเบฐ dump SVs เบ•เบฒเบเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบชเป‰เบฒเบ‡.
เบเบฒเบ™เบกเบต "ENTER"/"SAVETMPS" เปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เป€เบฎเบฑเบ”เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบšเปเปˆเบกเบตเบญเบฑเบ™เบญเบทเปˆเบ™
เบกเบฐเบ™เบธเบ”เบ–เบทเบเบ—เปเบฒเบฅเบฒเบ.

เบ„เบดเบ”เบงเปˆเบฒ macro เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบฎเบฑเบ”เบงเบฝเบเป€เบฅเบฑเบเบ™เป‰เบญเบเป€เบŠเบฑเปˆเบ™ "{" เปเบฅเบฐ "}" เปƒเบ™ Perl เป€เบžเบทเปˆเบญเบˆเปเบฒเบเบฑเบ”เบ‚เบญเบšเป€เบ‚เบ”เบ‚เบญเบ‡
เบ•เบปเบงเปเบ›เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™.

เป€เบšเบดเปˆเบ‡เบžเบฒเบ เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Perl to เบ–เบดเป‰เบก of เบŠเบปเปˆเบงเบ„เบฒเบง เบชเปเบฒเบฅเบฑเบšเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบ—เบฒเบ‡เป€เบฅเบทเบญเบเปƒเบ™เบเบฒเบ™
เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ macro เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰.

6. เบชเบธเบ”เบ—เป‰เบฒเบ, เป€เบชเบฑเป‰เบ™เบŠเป‰เบฒเบ เบ”เบฝเบงเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป‚เบ—เบœเปˆเบฒเบ™เบ—เบฒเบ‡ call_pv เบซเบ™เป‰เบฒเบ—เบตเปˆ. เบ—เบธเบ‡เบ”เบฝเบง
เบฅเบฐเบšเบธเป€เบงเบฅเบฒเบ™เบตเป‰เปเบกเปˆเบ™ G_DISCARD. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบœเปˆเบฒเบ™ 2 เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบเบฑเบš Perl
subroutine เป€เบงเบฅเบฒเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เบฅเบฐเบšเบธ G_NOARGS.

เบเบฑเบšเบกเบฒ a เบชเบฐเป€เบเบฅเบฒ
เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบกเบฒเบˆเบฒเบเบเบฒเบ™เบเปˆเบญเบ Perl.

เบ™เบตเป‰เปเบกเปˆเบ™ routine เบเปˆเบญเบ Perl, Adder, เบ—เบตเปˆเปƒเบŠเป‰เป€เบงเบฅเบฒ 2 เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบˆเปเบฒเบ™เบงเบ™เป€เบ•เบฑเบกเปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเบเบฑเบšเบ„เบทเบ™เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ
เบœเบปเบ™เบฅเบงเบก.

เบเปˆเบญเบ Adder
{
my($a, $b) = @_;
$a + $b;
}

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบซเปˆเบงเบ‡เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบเบฑเบšเบกเบนเบ™เบ„เปˆเบฒเบเบฑเบšเบ„เบทเบ™เบˆเบฒเบ Adder, เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™เบ‚เบญเบ‡ C เบ•เป‰เบญเบ‡เบเบฒเบ™
เป‚เบ—เบซเบฒเบกเบฑเบ™เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เปเบกเปˆเบ™เบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ.

void static
call_Adder(a, b)
int a;
int b;
{
dSP;
int เบ™เบฑเบš;

ENTER;
SAVETMPS;

PUSHMARK(SP);
XPUSHs(sv_2mortal(newSViv(a)));
XPUSHs(sv_2mortal(newSViv(b)));
PUTBACK;

count = call_pv("Adder", G_SCALAR);

SPAGAIN;

เบ–เป‰เบฒ (เบ™เบฑเบš != 1)
croak("เบšเบฑเบ™เบซเบฒเปƒเบซเบเปˆ\n");

printf ("เบœเบปเบ™เบฅเบงเบกเบ‚เบญเบ‡ %d เปเบฅเบฐ %d เปเบกเปˆเบ™ %d\n", a, b, POPi);

PUTBACK;
FREETMPS;
เบญเบญเบเบˆเบฒเบ;
}

เบˆเบธเบ”เบ—เบตเปˆเบ„เบงเบ™เบชเบฑเบ‡เป€เบเบ”เป€เบงเบฅเบฒเบ™เบตเป‰เปเบกเปˆเบ™

1. เบ—เบธเบ‡เบ”เบฝเบงเบ—เบตเปˆเบฅเบฐเบšเบธเป€เบงเบฅเบฒเบ™เบตเป‰เปเบกเปˆเบ™ G_SCALAR. เบ™เบฑเป‰เบ™เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ @_ array เบˆเบฐเป€เบ›เบฑเบ™
เบชเป‰เบฒเบ‡เปเบฅเบฐเบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เป‚เบ”เบ Adder เบˆเบฐเบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆเบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เป‚เบ—เบซเบฒ
call_pv.

2. เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡เบกเบฐเบซเบฒเบžเบฒเบ "SPAGAIN" เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเป‚เบซเบผเบ”เบซเบ™เป‰เบฒเบˆเปเบ„เบทเบ™เบชเปเบฒเป€เบ™เบปเบฒเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ‚เบญเบ‡เบ•เบปเบงเบŠเบตเป‰ stack.
เบ™เบตเป‰เปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบงเปˆเบฒเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเบ–เบทเบเบˆเบฑเบ”เบชเบฑเบ™เปƒเบซเป‰เบเบฑเบš Perl stack
เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบˆเบฑเบ”โ€‹เบชเบฑเบ™โ€‹เปƒเบ™โ€‹เป„เบฅโ€‹เบเบฐโ€‹ call_pv เป‚เบ—เบซเบฒ.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เปƒเบŠเป‰เบ•เบปเบงเบŠเบตเป‰ Perl stack เปƒเบ™เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เป‚เบซเบผเบ”เบซเบ™เป‰เบฒเบˆเปเบ„เบทเบ™เบชเบฐเป€เบซเบกเบต
เบชเปเบฒเป€เบ™เบปเบฒเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เป‚เบ”เบเปƒเบŠเป‰ SPAGAIN เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เปƒเบŠเป‰ เป‚เบ—_* เบซเบ™เป‰เบฒเบ—เบตเปˆเบซเบผเบทเปƒเบ”เป†
เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™เบžเบฒเบเปƒเบ™ Perl เบญเบทเปˆเบ™เป†.

3. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบกเบตเบžเบฝเบ‡เปเบ•เปˆเบกเบนเบ™เบ„เปˆเบฒเบ”เบฝเบงเบ—เบตเปˆเบ„เบฒเบ”เบงเปˆเบฒเบˆเบฐเบเบฑเบšเบ„เบทเบ™เบกเบฒเบˆเบฒเบ Adder, เบกเบฑเบ™เบเบฑเบ‡เบ”เบต
เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบฅเบฐเบซเบฑเบ”เบเบฑเบšเบ„เบทเบ™เบˆเบฒเบ call_pv เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก.

เบเบฒเบ™เบ„เบฒเบ”เบซเบงเบฑเบ‡เบกเบนเบ™เบ„เปˆเบฒเบญเบฑเบ™เบ”เบฝเบงเปเบกเปˆเบ™เบšเปเปˆเบ„เบทเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เบฎเบนเป‰เบงเปˆเบฒเบˆเบฐเบกเบตเบซเบ™เบถเปˆเบ‡. เบ–เป‰เบฒ
เบกเบตเบ„เบปเบ™เปเบเป‰เป„เบ‚ Adder เป€เบžเบทเปˆเบญเบเบฑเบšเบ„เบทเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ™เบฑเป‰เบ™เปเบฅเบฐ
เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก, stack Perl เบˆเบฐเบชเบดเป‰เบ™เบชเบธเบ”เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบ—เบตเปˆเบšเปเปˆเบชเบญเบ”เบ„เปˆเบญเบ‡. เบ™เบฑเป‰เบ™โ€‹เปเบกเปˆเบ™
เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™ เบเปเปˆ เบšเปเปˆโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เป€เบเบตเบ”โ€‹เบ‚เบถเป‰เบ™โ€‹.

4. เบกเบฐเบซเบฒเบžเบฒเบ "POPi" เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เป€เบžเบทเปˆเบญเบ›เปŠเบญเบšเบ„เปˆเบฒเบเบฑเบšเบ„เบทเบ™เบˆเบฒเบ stack. เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ™เบตเป‰
เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบˆเปเบฒเบ™เบงเบ™เป€เบ•เบฑเบก, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ "POPi" เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰.

เบ™เบตเป‰เปเบกเปˆเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเป€เบ•เบฑเบกเบ‚เบญเบ‡ POP macro เบ—เบตเปˆเบกเบตเบขเบนเปˆ, เบžเป‰เบญเบกเบเบฑเบšเบ›เบฐเป€เบžเบ”เบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเบชเบปเปˆเบ‡เบ„เบทเบ™.

POPs SV
เบ•เบปเบงเบŠเบตเป‰ POPp
POPn เบชเบญเบ‡เป€เบ—เบปเปˆเบฒ
เบˆเบณเบ™เบงเบ™เป€เบ•เบฑเบก POPi
POPL เบเบฒเบง

5. เบชเบธเบ”เบ—เป‰เบฒเบ "PUTBACK" เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบญเบญเบเบˆเบฒเบ Perl stack เบขเบนเปˆเปƒเบ™เบชเบฐเบžเบฒเบšเบ—เบตเปˆเบชเบญเบ”เบ„เปˆเบญเบ‡เบเปˆเบญเบ™
เบญเบญเบเบˆเบฒเบเบŸเบฑเบ‡เบŠเบฑเบ™. เบ™เบตเป‰เปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบฒเบฐเบงเปˆเบฒเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒ popped เบกเบนเบ™เบ„เปˆเบฒเบเบฑเบšเบ„เบทเบ™เบˆเบฒเบ
stack เบเบฑเบš "POPi" เบกเบฑเบ™เบ›เบฑเบšเบ›เบธเบ‡เบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเป€เบ™เบปเบฒเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ‚เบญเบ‡เบ•เบปเบงเบŠเบตเป‰ stack. เบˆเบทเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™,
"PUTBACK" เบเปเบฒเบ™เบปเบ”เบ•เบปเบงเบŠเบตเป‰ stack เบ—เบปเปˆเบงเป‚เบฅเบเปƒเบซเป‰เบ„เบทเบเบฑเบ™เบเบฑเบšเบชเปเบฒเป€เบ™เบปเบฒเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ.

เบเบฑเบšเบกเบฒ a เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบฅเบฒเบโ€‹เบŠเบทเปˆ of เบกเบนเบ™เบ„เปˆเบฒ
เบ•เบญเบ™เบ™เบตเป‰, เปƒเบซเป‰เบ‚เบฐเบซเบเบฒเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเป€เบžเบทเปˆเบญเบชเบปเปˆเบ‡เบ„เบทเบ™เบ—เบฑเบ‡เบœเบปเบ™เบฅเบงเบกเบ‚เบญเบ‡เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเปเบฅเบฐ
เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡.

เบ™เบตเป‰เปเบกเปˆเบ™เบฅเบฒเบเบเบฒเบ™เบเปˆเบญเบ Perl

เบเปˆเบญเบ AddSubtract
{
my($a, $b) = @_;
($a+$b, $a-$b);
}

เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบŸเบฑเบ‡เบŠเบฑเบ™ C

void static
call_AddSubtract(a, b)
int a;
int b;
{
dSP;
int เบ™เบฑเบš;

ENTER;
SAVETMPS;

PUSHMARK(SP);
XPUSHs(sv_2mortal(newSViv(a)));
XPUSHs(sv_2mortal(newSViv(b)));
PUTBACK;

count = call_pv("AddSubtract", G_ARRAY);

SPAGAIN;

เบ–เป‰เบฒ (เบ™เบฑเบš != 2)
croak("เบšเบฑเบ™เบซเบฒเปƒเบซเบเปˆ\n");

printf("%d - %d = %d\n", a, b, POPi);
printf("%d + %d = %d\n", a, b, POPi);

PUTBACK;
FREETMPS;
เบญเบญเบเบˆเบฒเบ;
}

If call_AddSubtract เป€เบญเบตเป‰เบ™เบงเปˆเบฒเปเบšเบšเบ™เบตเป‰

call_AddSubtract(7, 4);

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ™เบตเป‰เปเบกเปˆเบ™เบœเบปเบ™เบœเบฐเบฅเบดเบ”

7-4 = 3
7 + 4 = 11

เบญเปˆเบทเบ™

1. เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบšเบปเบ”เบฅเบฒเบเบเบฒเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ G_ARRAY เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰.

2. เบšเปเปˆเปเบ›เบเปƒเบˆเบงเปˆเบฒ "POPi" เบ–เบทเบเปƒเบŠเป‰เบชเบญเบ‡เป€เบ—เบทเปˆเบญเปƒเบ™เป€เบ—เบทเปˆเบญเบ™เบตเป‰ เป€เบžเบฒเบฐเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบเบณเบฅเบฑเบ‡เบ”เบถเบ‡เป€เบญเบปเบฒ 2 เบ„เปˆเบฒ.
เบˆเบฒเบ stack เป„เบ”เป‰. เบชเบดเปˆเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบ„เบงเบ™เบชเบฑเบ‡เป€เบเบ”เปเบกเปˆเบ™เบงเปˆเบฒเป€เบกเบทเปˆเบญเปƒเบŠเป‰ "POP*" macros เบžเบงเบเป€เบ‚เบปเบฒ
เบญเบญเบเบกเบฒเบˆเบฒเบ stack เปƒเบ™ เบเป‰เบญเบ™เบเบฑเบš order

เบเบฑเบšเบกเบฒ a เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบฅเบฒเบโ€‹เบŠเบทเปˆ in a เบชเบฐเป€เบเบฅเบฒ Context
เป€เบงเบปเป‰เบฒเบงเปˆเบฒ routine เบเปˆเบญเบ Perl เปƒเบ™เบžเบฒเบเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ–เบทเบเป€เบญเบตเป‰เบ™เปƒเบ™เบชเบฐเบžเบฒเบšเบเบฒเบ™, เปเบšเบšเบ™เบตเป‰

void static
call_AddSubScalar(a, b)
int a;
int b;
{
dSP;
int เบ™เบฑเบš;
int i;

ENTER;
SAVETMPS;

PUSHMARK(SP);
XPUSHs(sv_2mortal(newSViv(a)));
XPUSHs(sv_2mortal(newSViv(b)));
PUTBACK;

count = call_pv("AddSubtract", G_SCALAR);

SPAGAIN;

printf("เบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™ = %d\n", เบ™เบฑเบš);

เบชเปเบฒเบฅเบฑเบš (i = 1; i <= เบ™เบฑเบš; ++i)
printf("เบ„เปˆเบฒ %d = %d\n", i, POPi);

PUTBACK;
FREETMPS;
เบญเบญเบเบˆเบฒเบ;
}

เบเบฒเบ™โ€‹เบ”เบฑเบ”โ€‹เปเบเป‰โ€‹เบญเบทเปˆเบ™เป†โ€‹เบ—เบตเปˆโ€‹เป€เบฎเบฑเบ”โ€‹เปเบกเปˆเบ™โ€‹เบงเปˆเบฒโ€‹ call_AddSubScalar เบˆเบฐเบžเบดเบกเบˆเปเบฒเบ™เบงเบ™เบฅเบฒเบเบเบฒเบ™
เบเบฑเบšเบ„เบทเบ™เบˆเบฒเบ Perl subroutine เปเบฅเบฐเบกเบนเบ™เบ„เปˆเบฒเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ (เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบเบกเบฑเบ™เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเปเบกเปˆเบ™
เบˆเบณเบ™เบงเบ™เป€เบ•เบฑเบก). เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ–เป‰เบฒ call_AddSubScalar เบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒ

call_AddSubScalar(7, 4);

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบœเบปเบ™เบœเบฐเบฅเบดเบ”เบˆเบฐเป€เบ›เบฑเบ™

เบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™ = 1
เบกเบนเบ™เบ„เปˆเบฒ 1 = 3

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบˆเบธเบ”เบ•เบปเป‰เบ™เบ•เปเบ—เบตเปˆเบ„เบงเบ™เบชเบฑเบ‡เป€เบเบ”เปเบกเปˆเบ™เบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเบฅเบฒเบเบเบฒเบ™เบชเบธเบ”เบ—เป‰เบฒเบเปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ—เบตเปˆเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™
เบˆเบฒเบเบ›เบปเบเบเบฐเบ•เบดเบเปˆเบญเบ. เบ•เบทเปˆเบกเบเบฒเบ™เบซเบฑเบเบฅเบปเบš เบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบงเป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™ call_AddSubScalar.

เบเบฑเบšเบกเบฒ เบ‚เปเป‰เบกเบนเบ™ เบˆเบฒเบ Perl เบœเปˆเบฒเบ™ เป„เบ”เป‰ เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบฅเบฒเบโ€‹เบŠเบทเปˆ
เบกเบฑเบ™เบเบฑเบ‡เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เปˆเบฒเป‚เบ”เบเบเบปเบ‡เบœเปˆเบฒเบ™เบฅเบฒเบเบเบฒเบ™เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต - เบšเปเปˆเบงเปˆเบฒเบˆเบฐเป€เบ›เบฑเบ™
เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบ„เบงเบฒเบกเบ›เบฒเบ–เบฐเบซเบ™เบฒเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบกเบฑเบ™เปเบกเปˆเบ™เป€เบฅเบทเปˆเบญเบ‡เบญเบทเปˆเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”.

เบ›เบปเบเบเบฐเบ•เบดเบเปˆเบญเบ Perl, Inc, เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปƒเบŠเป‰เป€เบงเบฅเบฒ 2 เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เปเบฅเบฐเบเบฒเบ™เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เปเบ•เปˆเบฅเบฐเบ„เบปเบ™เป‚เบ”เบเบเบปเบ‡.

เบเปˆเบญเบ Inc
{
++ $_[0];
++ $_[1];
}

เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบŸเบฑเบ‡เบŠเบฑเบ™ C เป€เบžเบทเปˆเบญเป‚เบ—เบซเบฒเบกเบฑเบ™.

void static
call_Inc(a, b)
int a;
int b;
{
dSP;
int เบ™เบฑเบš;
SV * sva;
SV * svb;

ENTER;
SAVETMPS;

sva = sv_2mortal(newSViv(a));
svb = sv_2mortal(newSViv(b));

PUSHMARK(SP);
XPUSHs(sva);
XPUSHs(svb);
PUTBACK;

count = call_pv("Inc", G_DISCARD);

เบ–เป‰เบฒ (เบ™เบฑเบš != 0)
croak ("call_Inc: เบ„เบฒเบ”เบเบฒเบ™ 0 เบ„เปˆเบฒเบˆเบฒเบ 'Inc', เป„เบ”เป‰ %d\n",
เบ™เบฑเบš);

printf("%d + 1 = %d\n", a, SvIV(sva));
printf("%d + 1 = %d\n", b, SvIV(svb));

FREETMPS;
เบญเบญเบเบˆเบฒเบ;
}

เป€เบžเบทเปˆเบญเปƒเบซเป‰เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบชเบญเบ‡เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เบตเปˆเบ–เบทเบ pushed เปƒเบชเปˆ stack เบซเบผเบฑเบ‡เบˆเบฒเบเบžเบงเบเป€เบ‚เบปเบฒเบเบฑเบšเบ„เบทเบ™เบกเบฒ
เบˆเบฒเบ call_pv เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบขเบนเปˆเบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ - เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เบฑเบ‡เบชเบญเบ‡เบ•เบปเบงเปเบ›
"sva" เปเบฅเบฐ "svb".

เป€เบซเบ”เบœเบปเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™เปเบกเปˆเบ™เบงเปˆเบฒเบžเบทเป‰เบ™เบ—เบตเปˆเบ‚เบญเบ‡ stack Perl เบ—เบตเปˆเบ–เบทเปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบซเบผเบฒเบ
เบญเบฒเบ”เบˆเบฐเบ–เบทเบเบ‚เบฝเบ™เบ—เบฑเบšเป‚เบ”เบเบชเบดเปˆเบ‡เบญเบทเปˆเบ™เป‚เบ”เบเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเป€เบงเบฅเบฒเบเบฑเบšเบ„เบทเบ™เบกเบฒ call_pv.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ G_EVAL
เบ•เบญเบ™เบ™เบตเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเปƒเบŠเป‰ G_EVAL. เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™เบŠเบธเบ”เบเปˆเบญเบ Perl เบ—เบตเปˆเบ„เบดเบ”เป„เบฅเปˆเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบ‚เบญเบ‡
2 เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™. เบ–เป‰เบฒเบญเบฑเบ™เบ™เบตเป‰เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบฒเบ‡เบฅเบปเบš, เบšเบฑเบ™เบŠเบตเบเปˆเบญเบเบˆเบฐเป‚เบ—เบซเบฒ เป„เบ”เป‰.

เบฅเบปเบš
{
เบ‚เบญเบ‡เบ‚เป‰เบญเบ ($a, $b) = @_;

die "เบ„เบงเบฒเบกเบ•เบฒเบเบชเบฒเบกเบฒเบ”เบ•เบฒเบเป„เบ”เป‰\n" เบ–เป‰เบฒ $a < $b;

$a - $b;
}

เปเบฅเบฐเบšเบฒเบ‡ C เป‚เบ—เบซเบฒเบกเบฑเบ™

void static
call_Subtract(a, b)
int a;
int b;
{
dSP;
int เบ™เบฑเบš;

ENTER;
SAVETMPS;

PUSHMARK(SP);
XPUSHs(sv_2mortal(newSViv(a)));
XPUSHs(sv_2mortal(newSViv(b)));
PUTBACK;

count = call_pv("Subtract", G_EVAL|G_SCALAR);

SPAGAIN;

/* เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบเบฒเบ™โ€‹เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบเปˆเบญเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐ */
เบ–เป‰เบฒ (SvTRUE(ERRSV))
{
printf ("เป‚เบญเป‰เบ - %s\n", SvPV_nolen(ERRSV));
POPs;
}
เบญเบทเปˆเบ™
{
เบ–เป‰เบฒ (เบ™เบฑเบš != 1)
croak("call_Subtract: เบ•เป‰เบญเบ‡เบเบฒเบ™ 1 เบ„เปˆเบฒเบˆเบฒเบ 'Subtract', เป„เบ”เป‰ %d\n",
เบ™เบฑเบš);

printf("%d - %d = %d\n", a, b, POPi);
}

PUTBACK;
FREETMPS;
เบญเบญเบเบˆเบฒเบ;
}

If call_Subtract เป€เบญเบตเป‰เบ™เบงเปˆเบฒเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™

call_Subtract(4, 5)

เบ•เปเปˆเป„เบ›เบ™เบตเป‰เบˆเบฐเบ–เบทเบเบžเบดเบกเบญเบญเบ

เป‚เบญเป‰เบ - เบ„เบงเบฒเบกเบ•เบฒเบเบชเบฒเบกเบฒเบ”เบ•เบฒเบเป„เบ”เป‰

เบญเปˆเบทเบ™

1. เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบชเบฒเบกเบฒเบ”เบˆเบฑเบšเป„เบ”เป‰ เป„เบ”เป‰ เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เปƒเบŠเป‰เบ—เบธเบ‡ G_EVAL. เบšเปเปˆเป„เบ”เป‰เบฅเบฐเบšเบธ
เบ—เบธเบ‡เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเป‚เบ„เบ‡เบเบฒเบ™เบˆเบฐเบขเบธเบ”เบ•เบดเบ—เบฑเบ™เบ—เบตเบขเบนเปˆเบ—เบตเปˆ เป„เบ”เป‰
เบ„เปเบฒโ€‹เบ–เบฐโ€‹เปเบซเบผเบ‡โ€‹เบเบฒเบ™โ€‹เปƒเบ™ subroutine เป„เบ”เป‰โ€‹ เบเบฒเบ™เบซเบฑเบเบฅเบปเบš.

2. เบฅเบฐเบซเบฑเบ”

เบ–เป‰เบฒ (SvTRUE(ERRSV))
{
printf ("เป‚เบญเป‰เบ - %s\n", SvPV_nolen(ERRSV));
POPs;
}

เปเบกเปˆเบ™เบ—เบฝเบšเป€เบ—เบปเปˆเบฒเป‚เบ”เบเบเบปเบ‡เบ‚เบญเบ‡ Perl เบ™เบตเป‰

เบžเบดเบก "เป‚เบญเป‰เบ - $@\n" เบ–เป‰เบฒ $@;

"PL_errgv" เปเบกเปˆเบ™ perl เบ—เบปเปˆเบงเป‚เบฅเบเบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” "GV *" เบ—เบตเปˆเบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบชเบฑเบ™เบเบฒเบฅเบฑเบ
เบกเบตโ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹. "ERRSV" เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบˆเบถเปˆเบ‡เบซเบกเบฒเบเป€เบ–เบดเบ‡ C เบ—เบฝเบšเป€เบ—เบปเปˆเบฒเบเบฑเบš $@.

3. เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒ stack เปเบกเปˆเบ™ popped เป‚เบ”เบเปƒเบŠเป‰ "POPs" เปƒเบ™เบšเบฅเบฑเบญเบเบšเปˆเบญเบ™เบ—เบตเปˆ "SvTRUE(ERRSV)" เปเบกเปˆเบ™.
เบ„เบงเบฒเบกเบˆเบดเบ‡. เบ™เบตเป‰เปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบฒเบฐเบงเปˆเบฒเบ—เบธเบเบ„เบฑเป‰เบ‡ a เป‚เบ—_* เบซเบ™เป‰เบฒโ€‹เบ—เบตเปˆโ€‹เบฎเบฝเบโ€‹เบฎเป‰เบญเบ‡โ€‹เปƒเบซเป‰โ€‹เบกเบตโ€‹
G_EVAL|G_SCALAR เบ•เบญเบšเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”, เป€เบ—เบดเบ‡เบชเบธเบ”เบ‚เบญเบ‡ stack เบ–เบทเบ„เปˆเบฒ undefเบ—เบตเปˆเบขเบนเปˆ เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ
เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เปƒเบซเป‰โ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบชเบทเบšโ€‹เบ•เปเปˆโ€‹เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบเบงเบ”โ€‹เบžเบปเบšโ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹เบ™เบตเป‰โ€‹, เบกเบฑเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบชเบดเปˆเบ‡โ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบ—เบตเปˆโ€‹
stack เป„เบ”เป‰ tidied เป€เบ–เบดเบ‡ เป‚เบ”เบ เบเบฒเบ™ เบฅเบปเบš undef.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ G_KEEPERR
เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเปเบ›เบเบ›เบฐเบซเบฅเบฒเบ”เบ™เบตเป‰, เบšเปˆเบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เปƒเบŠเป‰เบชเบฐเบšเบฑเบš XS เบ‚เบญเบ‡
call_Subtract เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบžเบฒเบเปƒเบ™ destructor:

package foo;
เบเปˆเบญเบเปƒเปเปˆ { เบญเบงเบเบžเบญเบ™ {}, $_[0] }
เบฅเบปเบš {
my($a,$b) = @_;
die "เบ„เบงเบฒเบกเบ•เบฒเบเบชเบฒเบกเบฒเบ”เบ•เบฒเบเป„เบ”เป‰" เบ–เป‰เบฒ $a< $b;
$a - $b;
}
sub DESTROY { call_Subtract(5, 4); }
sub foo { die "foo dies"; }

package main;
{
เบ‚เบญเบ‡เบ‚เป‰เบญเบ $foo = Foo->เปƒเปเปˆ;
eval { $foo->foo };
}
เบžเบดเบก "Saw: $@" เบ–เป‰เบฒ $@; # เบ„เบงเบ™เบˆเบฐเป€เบ›เบฑเบ™, เปเบ•เปˆเบšเปเปˆเปเบกเปˆเบ™

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰เบˆเบฐเบšเปเปˆเบฎเบฑเบšเบฎเบนเป‰เบงเปˆเบฒเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เป€เบเบตเบ”เบ‚เบถเป‰เบ™เบžเบฒเบเปƒเบ™ "eval {}". เบ™เบตเป‰เปเบกเปˆเบ™
เป€เบ›เบฑเบ™เบซเบเบฑเบ‡: เบฅเบฐเบซเบฑเบ” call_Subtract เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆ perl เบเปเบฒเบฅเบฑเบ‡เบ—เปเบฒเบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ”เบŠเบปเปˆเบงเบ„เบฒเบงเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ
เบญเบญเบเบˆเบฒเบเบšเบฅเบฑเบญเบเบงเบปเบ‡เป€เบฅเบฑเบšเบžเบฒเบเบ™เบญเบ, เปเบฅเบฐเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ call_Subtract เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบ”เป‰เบงเบ call_pv
เป‚เบ”เบเปƒเบŠเป‰เบ—เบธเบ‡ G_EVAL, เบกเบฑเบ™เบฃเบตเป€เบŠเบฑเบ” $@ เบ—เบฑเบ™เบ—เบต. เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบผเบงเบ‚เบญเบ‡ outermost เป„เบ”เป‰
เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบชเปเบฒเบฅเบฑเบš $@, เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบผเบงเบ‚เบญเบ‡เบเบฑเบšเบ”เบฑเบเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”.

เบเบฒเบ™เบ•เปเปˆเบ—เป‰เบฒเบเบ—เบธเบ‡ G_KEEPERR, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ call_pv เป‚เบ—เปƒเบ™ call_Subtract เบญเปˆเบฒเบ™:

count = call_pv("Subtract", G_EVAL|G_SCALAR|G_KEEPERR);

เบˆเบฐเบฎเบฑเบเบชเบฒเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบฅเบฐเบŸเบทเป‰เบ™เบŸเบนเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ call_sv
เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เป‰เบญเบเบกเบต 'เบชเบฒเบเป„เบŸเปเบ‚เบ‡' เบŠเบทเปˆเบ‚เบญเบ‡ Perl subroutine เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™
เป€เบญเบตเป‰เบ™เบงเปˆเบฒเบˆเบฒเบ C. เบชเปˆเบงเบ™เบซเบผเบฒเบเปเบกเปˆเบ™, เบกเบฑเบ™เบชเบฐเบ”เบงเบเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบชเบฒเบกเบฒเบ”เบฅเบฐเบšเบธเป„เบ”เป‰
เบŠเบทเปˆเบ‚เบญเบ‡ routine เบเปˆเบญเบ Perl เบˆเบฒเบเบžเบฒเบเปƒเบ™ Perl script.

เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบฅเบฐเบซเบฑเบ” Perl เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰

เบเปˆเบญเบ fred
{
เบžเบดเบก "เบชเบฐเบšเบฒเบเบ”เบต\n";
}

CallSubPV("fred");

เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡ XSUB เป€เบŠเบดเปˆเบ‡เบเปเบฒเบ™เบปเบ” เป‚เบ—SubPV.

void
CallSubPV(เบŠเบทเปˆ)
char * เบŠเบทเปˆ
เบฅเบฐเบซเบฑเบ”:
PUSHMARK(SP);
call_pv(เบŠเบทเปˆ, G_DISCARD|G_NOARGS);

เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบ”เบตเป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบกเบฑเบ™เป„เบ›. เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบ›เบฑเบ™, Perl subroutine เบชเบฒเบกเบฒเบ”เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป€เบ›เบฑเบ™เบžเบฝเบ‡เปเบ•เปˆ
เปเบ™เบงเปƒเบ”เบเปเปˆเบ•เบฒเบก, Perl เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบญเป‰เบฒเบ‡เบญเบตเบ‡เป€เบ–เบดเบ‡ routines เปเบฅเบฐ subroutines เบ—เบตเปˆเบšเปเปˆเป€เบ›เบตเบ”เป€เบœเบตเบเบŠเบทเปˆ. เบ™เบตเป‰
เปเบกเปˆเบ™เบšเปˆเบญเบ™เบ—เบตเปˆ call_sv เปเบกเปˆเบ™เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”.

เบฅเบฐเบซเบฑเบ”เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เบชเปเบฒเบฅเบฑเบš CallSubSV เปเบกเปˆเบ™เบ„เบทเบเบฑเบ™เบเบฑเบš เป‚เบ—SubPV เบเบปเบเป€เบงเบฑเป‰เบ™เบงเปˆเบฒ "เบŠเบทเปˆ" เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเปเบกเปˆเบ™
เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบเปเบฒเบ™เบปเบ”เป€เบ›เบฑเบ™ SV* เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ call_sv เปเบ—เบ™โ€‹เบ—เบตเปˆ call_pv.

void
CallSubSV(เบŠเบทเปˆ)
SV * เบŠเบทเปˆ
เบฅเบฐเบซเบฑเบ”:
PUSHMARK(SP);
call_sv(เบŠเบทเปˆ, G_DISCARD|G_NOARGS);

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เปƒเบŠเป‰ SV เป€เบžเบทเปˆเบญเป‚เบ—เบซเบฒ Fred เบ•เปเปˆเป„เบ›เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เบ—เบฑเบ‡เบซเบกเบปเบ”:

CallSubSV("fred");
CallSubSV(\&fred);
$ref = \&fred;
CallSubSV($ref);
CallSubSV(เบเปˆเบญเบ {เบžเบดเบก "เบชเบฐเบšเบฒเบเบ”เบตเบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™\n" } );

เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡, call_sv เป€เบฎเบฑเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบกเบตเบ„เบงเบฒเบกเบเบทเบ”เบซเบเบธเปˆเบ™เบซเบผเบฒเบเบเบงเปˆเบฒเป€เบเบปเปˆเบฒเปƒเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบฅเบฐเบšเบธ Perl เป„เบ”เป‰
เบ›เบฐเบˆเบณเบเปˆเบญเบ.

เบ—เปˆเบฒเบ™เบ„เบงเบ™เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒ, เบ–เป‰เบฒเบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ SV ("เบŠเบทเปˆ" เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡).
เป€เบŠเบดเปˆเบ‡เบเบปเบ‡เบเบฑเบš routine เบเปˆเบญเบ Perl เป€เบžเบทเปˆเบญเปƒเบซเป‰เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบ•เปเปˆเบกเบฒเปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™, เบกเบฑเบ™
เบšเปเปˆเบžเบฝเบ‡เบžเปเบžเบฝเบ‡เปเบ•เปˆเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบชเปเบฒเป€เบ™เบปเบฒเบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒ SV. เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบฅเบฐเบซเบฑเบ”เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เป€เบ„เบตเบเป€เบ›เบฑเบ™เบ„เบท
เบ™เบตเป‰:

static SV * RememberSub;

void
SaveSub1(เบŠเบทเปˆ)
SV * เบŠเบทเปˆ
เบฅเบฐเบซเบฑเบ”:
RememberSub = เบŠเบทเปˆ;

void
CallSavedSub1()
เบฅเบฐเบซเบฑเบ”:
PUSHMARK(SP);
call_sv(rememberSub, G_DISCARD|G_NOARGS);

เป€เบซเบ”เบœเบปเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบœเบดเบ”เบžเบฒเบ”เปเบกเปˆเบ™เบงเปˆเบฒ, เป€เบกเบทเปˆเบญเป€เบงเบฅเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เบกเบฒเปƒเบŠเป‰เบ•เบปเบงเบŠเบตเป‰ "rememberSub" เปƒเบ™
"CallSavedSub1", เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบซเบผเบทเบญเบฒเบ”เบˆเบฐเบšเปเปˆเบเบฑเบ‡เบซเบกเบฒเบเป€เบ–เบดเบ‡เบเบฒเบ™เบเปˆเบญเบ Perl เบ—เบตเปˆเบ–เบทเบเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เปƒเบ™
"SaveSub1". เบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบชเปเบฒเบฅเบฑเบšเบเปเบฅเบฐเบ™เบตเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰:

SaveSub1(\&fred);
CallSavedSub1();

SaveSub1( เบเปˆเบญเบ {เบžเบดเบก "เบชเบฐเบšเบฒเบเบ”เบตเบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™\n" } );
CallSavedSub1();

เป€เบกเบทเปˆเบญเปเบ•เปˆเบฅเบฐเบ„เปเบฒเบ–เบฐเปเบซเบผเบ‡เบเบฒเบ™ "SaveSub1" เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”, SV*s เบ—เบตเปˆ
เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™เบเบฑเบšเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบˆเบฐเบšเปเปˆเบกเบตเบ•เปเปˆเป„เบ›เบญเบตเบเปเบฅเป‰เบง. เบ„เบฒเบ”เบงเปˆเบฒเบˆเบฐเบกเบตเบ‚เปเป‰เบ„เบงเบฒเบกเบชเบฐเปเบ”เบ‡เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบˆเบฒเบ Perl of
เปเบšเบšเบŸเบญเบก

เบšเปเปˆโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบ„เปˆเบฒโ€‹เบ—เบตเปˆโ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เป€เบ›เบฑเบ™โ€‹เบเบฒเบ™โ€‹เบญเป‰เบฒเบ‡โ€‹เบญเบตเบ‡โ€‹เบฅเบฐโ€‹เบšเบปเบšโ€‹เบเปˆเบญเบโ€‹เบ—เบตเปˆ ...

เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบชเบฒเบ "CallSavedSub1".

เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™, เบกเบตเบฅเบฐเบซเบฑเบ”เบ™เบตเป‰

$ref = \&fred;
SaveSub1($ref);
$ref = 47;
CallSavedSub1();

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ„เบฒเบ”เบซเบงเบฑเบ‡เบงเปˆเบฒเบซเบ™เบถเปˆเบ‡เปƒเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰ (เบ—เบตเปˆเบ—เปˆเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบ•เบปเบงเบˆเบดเบ‡เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบชเบฐเบšเบฑเบš
เบ‚เบญเบ‡ Perl เบ—เบตเปˆโ€‹เบ—เปˆเบฒเบ™โ€‹เบเปเบฒโ€‹เบฅเบฑเบ‡โ€‹เปƒเบŠเป‰โ€‹)

เบšเปเปˆเปเบกเปˆเบ™เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡ CODE เบขเบนเปˆ...
routine เบเปˆเบญเบเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบเปเบฒเบ™เบปเบ” &main::47 เป€เบญเบตเป‰เบ™เบงเปˆเบฒ ...

เบ•เบปเบงเปเบ› $ref เบญเบฒเบ”เบˆเบฐเป„เบ”เป‰เบญเป‰เบฒเบ‡เบญเบตเบ‡เป€เบ–เบดเบ‡ subroutine "fred" เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆเป‚เบ—เบซเบฒ
"SaveSub1" เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เปเบ•เปˆเป€เบกเบทเปˆเบญ "CallSavedSub1" เบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบกเบฑเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เบ–เบทเบ•เบปเบงเป€เบฅเบ.
47. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบšเบฑเบ™เบ—เบถเบเบžเบฝเบ‡เปเบ•เปˆเบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒ SV เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเปƒเบ™ "SaveSub1", เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ”เป†เบ•เปเปˆเบเบฑเบš $ref.
เบˆเบฐเบ–เบทเบเบ•เบดเบ”เบ•เบฒเบกเป‚เบ”เบเบ•เบปเบงเบŠเบตเป‰ "rememberSub". เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบ—เบธเบเบ„เบฑเป‰เบ‡ "CallSavedSub1"
เบ–เบทเบเป€เบญเบตเป‰เบ™, เบกเบฑเบ™เบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบ›เบฐเบ•เบดเบšเบฑเบ”เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบญเป‰เบฒเบ‡เบญเบตเบ‡เป‚เบ”เบ SV*
"rememberSub". เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบกเบฑเบ™เบซเบกเบฒเบเป€เบ–เบดเบ‡เบˆเปเบฒเบ™เบงเบ™เป€เบ•เบฑเบก 47, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ„เบฒเบ”เบงเปˆเบฒ Perl เบˆเบฐ
เบˆเบปเปˆเบกเบ”เบฑเบ‡เป†.

เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เปเบ•เปˆเบฅเบฐเบญเบฝเบ”เบเบงเปˆเบฒเปเบกเปˆเบ™เบชเบฐเปเบ”เบ‡เบ”เป‰เบงเบเบฅเบฐเบซเบฑเบ”เบ™เบตเป‰:

$ref = \&fred;
SaveSub1($ref);
$ref = \&joe;
CallSavedSub1();

เป€เบงเบฅเบฒเบ™เบตเป‰เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆ "CallSavedSub1" เบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบกเบฑเบ™เบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ Perl subroutine "joe"
(เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบกเบฑเบ™เบกเบตเบขเบนเปˆ) เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™ "fred" เบ•เบฒเบกเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เปƒเบ™เบเบฒเบ™เป‚เบ—เบซเบฒ
"SaveSub1".

เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบชเปเบฒเป€เบ™เบปเบฒเบชเบฐเบšเบฑเบšเป€เบ•เบฑเบกเบ‚เบญเบ‡ SV. เบฅเบฐเบซเบฑเบ”
เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™ "SaveSub2" เบ”เบฑเบ”เปเบเป‰เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปเบ™เบงเบ™เบฑเป‰เบ™.

static SV * keepSub = (SV*)NULL;

void
SaveSub2(เบŠเบทเปˆ)
SV * เบŠเบทเปˆ
เบฅเบฐเบซเบฑเบ”:
/* เป€เบญเบปเบฒเบชเบณเป€เบ™เบปเบฒเบ‚เบญเบ‡เบเบฒเบ™เป‚เบ—เบเบฑเบš */
เบ–เป‰เบฒ (keepSub == (SV*)NULL)
/* เบ„เบฑเป‰เบ‡เบ—เบณเบญเบดเบ”, เบชเบฐเบ™เบฑเป‰เบ™เบชเป‰เบฒเบ‡ SV เปƒเปเปˆ */
keepSub = newSVsv(เบŠเบทเปˆ);
เบญเบทเปˆเบ™
/* เป€เบ„เบตเบเบขเบนเปˆเบ™เบตเป‰เบเปˆเบญเบ™, เบชเบฐเบ™เบฑเป‰เบ™เบ‚เบฝเบ™เบ—เบฑเบš */
SvSetSV(keepSub, เบŠเบทเปˆ);

void
CallSavedSub2()
เบฅเบฐเบซเบฑเบ”:
PUSHMARK(SP);
call_sv(keepSub, G_DISCARD|G_NOARGS);

เป€เบžเบทเปˆเบญเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™เบชเป‰เบฒเบ‡ SV เปƒเบซเบกเปˆเบ—เบธเบเบ„เบฑเป‰เบ‡ "SaveSub2" เบ–เบทเบเป€เบญเบตเป‰เบ™, เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เปเบฒเบญเบดเบ”เบเบงเบ”เป€เบšเบดเปˆเบ‡
เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเป€เบญเบตเป‰เบ™เบเปˆเบญเบ™. เบ–เป‰เบฒเบšเปเปˆ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบทเป‰เบ™เบ—เบตเปˆเบชเปเบฒเบฅเบฑเบš SV เปƒเบซเบกเปˆเปเบกเปˆเบ™เบˆเบฑเบ”เบชเบฑเบ™เปเบฅเบฐ
เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบดเบ‡เป€เบ–เบดเบ‡ Perl subroutine "เบŠเบทเปˆ" เบ–เบทเบเบ„เบฑเบ”เบฅเบญเบเป„เบ›เบซเบฒเบ•เบปเบงเปเบ› "keepSub" เปƒเบ™เบซเบ™เบถเปˆเบ‡.
เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เป‚เบ”เบเปƒเบŠเป‰ "newSVsv". เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆ "SaveSub2" เบ–เบทเบเป€เบญเบตเป‰เบ™, SV เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง,
"keepSub", เบ–เบทเบเบ‚เบฝเบ™เบ—เบฑเบšเบ”เป‰เบงเบเบ„เปˆเบฒเปƒเบซเบกเปˆเป‚เบ”เบเปƒเบŠเป‰ "SvSetSV".

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ call_argv
เบ™เบตเป‰เปเบกเปˆเบ™เบฅเบฒเบเบเบฒเบ™เบเปˆเบญเบ Perl เบ—เบตเปˆเบžเบดเบกเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเปƒเบ”เบเปเปˆเบ•เบฒเบกเบ—เบตเปˆเบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบซเบฒเบกเบฑเบ™.

เบฅเบฒเบเบŠเบทเปˆเบžเบดเบกเบเปˆเบญเบ
{
my(@list) = @_;

foreach (@list) { เบžเบดเบก "$_\n" }
}

เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡ call_argv เป€เบŠเบดเปˆเบ‡เบˆเบฐเป‚เบ—เบซเบฒ เบฅเบฒเบเบŠเบทเปˆเบžเบดเบก.

static char * words[] = {"alpha", "beta", "gamma", "delta", NULL};

void static
call_PrintList()
{
dSP;

call_argv("PrintList", G_DISCARD, เบ„เปเบฒ);
}

เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบตเปˆเบˆเบฐเป‚เบ—เบซเบฒ "PUSHMARK" เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰. เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบเป‰เบญเบ™โ€‹เบงเปˆเบฒ
call_argv เบˆเบฐเป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”เบกเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ call_method
เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบฅเบฐเบซเบฑเบ” Perl เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

{
package เบฅเบฐเป€เบšเบตเบ”เบเบฑเบ‡เบ”เบดเบ™;

เบเปˆเบญเบเปƒเบซเบกเปˆ
{
my($type) = shift;
เบญเบงเบเบžเบญเบ™ [@_]
}

เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบเปˆเบญเบ
{
เบ‚เบญเบ‡เบ‚เป‰เบญเบ ($self, $index) = @_;
เบžเบดเบก "$index: $$self[$index]\n";
}

sub PrintID
{
my($class) = @_;
เบžเบดเบก "เบ™เบตเป‰เปเบกเปˆเบ™ Class $class version 1.0\n";
}
}

เบกเบฑเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบžเบฝเบ‡เปเบ•เปˆเบซเป‰เบญเบ‡เบฎเบฝเบ™เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบเปƒเบ™เบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡ array. เบ™เบญเบเบˆเบฒเบเบœเบนเป‰เบเปเปˆเบชเป‰เบฒเบ‡,
"เปƒเบซเบกเปˆ", เบกเบฑเบ™เบ›เบฐเบเบฒเบ”เบงเบดเบ—เบตเบเบฒเบ™, เบซเบ™เบถเปˆเบ‡ static เปเบฅเบฐเบซเบ™เบถเปˆเบ‡ virtual. เบงเบดเบ—เบตเบเบฒเบ™เบ„เบปเบ‡เบ—เบตเปˆ, "PrintID",
เบžเบดเบกเบญเบญเบเบžเบฝเบ‡เปเบ•เปˆเบŠเบทเปˆเบŠเบฑเป‰เบ™เบฎเบฝเบ™เปเบฅเบฐเบ•เบปเบงเป€เบฅเบเบชเบฐเบšเบฑเบš. เบงเบดเบ—เบตเบเบฒเบ™ virtual, "เบชเบฐเปเบ”เบ‡",
เบžเบดเบกเบญเบญเบเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ”เบฝเบงเบ‚เบญเบ‡เบญเบฒเป€เบฃ. เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡ All-Perl เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰เบกเบฑเบ™.

$a = mine->new('เบชเบตเปเบ”เบ‡', 'เบชเบตเบ‚เบฝเบง', 'เบชเบตเบŸเป‰เบฒ');
$a->เบเบฒเบ™เบชเบฐเปเบ”เบ‡(1)
mine->PrintID;

เบˆเบฐเบžเบดเบก

1: เบชเบตเบ‚เบฝเบง
เบ™เบตเป‰เปเบกเปˆเบ™ Class Mine เบฅเบธเป‰เบ™ 1.0

เบเบฒเบ™เป‚เบ—เบซเบฒเบงเบดเบ—เบตเบเบฒเบ™ Perl เบˆเบฒเบ C เปเบกเปˆเบ™เบเบปเบ‡เป„เบ›เบเบปเบ‡เบกเบฒ. เบชเบดเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰เปเบกเปˆเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™:

ยท เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡เป€เบ–เบดเบ‡เบงเบฑเบ”เบ–เบธเบชเปเบฒเบฅเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™ virtual เบซเบผเบทเบŠเบทเปˆเบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™เบชเปเบฒเบฅเบฑเบš static
เบงเบดเบ—เบตเบเบฒเบ™

ยทเบŠเบทเปˆเบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™

ยท เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบญเบทเปˆเบ™เป†เบชเบฐเป€เบžเบฒเบฐเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™

เบ™เบตเป‰เปเบกเปˆเบ™ XSUB เบ‡เปˆเบฒเบเป†เบ—เบตเปˆเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบเบปเบ™เป„เบเบเบฒเบ™เป‚เบ—เบซเบฒเบ—เบฑเบ‡ "PrintID" เปเบฅเบฐ
เบงเบดเบ—เบตเบเบฒเบ™ "เบชเบฐเปเบ”เบ‡" เบˆเบฒเบ C.

void
call_Method(เบญเป‰เบฒเบ‡เบญเบตเบ‡, เบงเบดเบ—เบตเบเบฒเบ™, เบ”เบฑเบ”เบŠเบฐเบ™เบต)
SV * เบญเป‰เบฒเบ‡เบญเบตเบ‡
char * เบงเบดเบ—เบตเบเบฒเบ™
เบ”เบฑเบ”เบŠเบฐเบ™เบต int
เบฅเบฐเบซเบฑเบ”:
PUSHMARK(SP);
XPUSHs(เบญเป‰เบฒเบ‡เบญเบตเบ‡);
XPUSHs(sv_2mortal(newSViv(index)));
PUTBACK;

call_method(เบงเบดเบ—เบตเบเบฒเบ™, G_DISCARD);

void
call_PrintID(เบŠเบฑเป‰เบ™, เบงเบดเบ—เบตเบเบฒเบ™)
char * เบซเป‰เบญเบ‡เบฎเบฝเบ™
char * เบงเบดเบ—เบตเบเบฒเบ™
เบฅเบฐเบซเบฑเบ”:
PUSHMARK(SP);
XPUSHs(sv_2mortal(newSVpv(เบŠเบฑเป‰เบ™, 0)));
PUTBACK;

call_method(เบงเบดเบ—เบตเบเบฒเบ™, G_DISCARD);

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบงเบดเบ—เบตเบเบฒเบ™ "PrintID" เปเบฅเบฐ "เบเบฒเบ™เบชเบฐเปเบ”เบ‡" เบชเบฒเบกเบฒเบ”เบ–เบทเบเป€เบญเบตเป‰เบ™เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

$a = mine->new('เบชเบตเปเบ”เบ‡', 'เบชเบตเบ‚เบฝเบง', 'เบชเบตเบŸเป‰เบฒ');
call_Method($a, 'เบชเบฐเปเบ”เบ‡', 1);
call_PrintID('Mine', 'PrintID');

เบชเบดเปˆเบ‡เบ”เบฝเบงเบ—เบตเปˆเบ„เบงเบ™เบชเบฑเบ‡เป€เบเบ”เปเบกเปˆเบ™เบงเปˆเบฒ, เปƒเบ™เบ—เบฑเบ‡เบงเบดเบ—เบตเบเบฒเบ™ static เปเบฅเบฐ virtual, เบŠเบทเปˆเบงเบดเบ—เบตเบเบฒเบ™เปเบกเปˆเบ™
เบšเปเปˆเบœเปˆเบฒเบ™ stack - เบกเบฑเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบ›เบฑเบ™เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบˆเบฐ call_method.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ GIMME_V
เบ™เบตเป‰เปเบกเปˆเบ™ XSUB เป€เบฅเบฑเบเบ™เป‰เบญเบเบ—เบตเปˆเบžเบดเบกเบšเปเบฅเบดเบšเบปเบ”เบ—เบตเปˆเบกเบฑเบ™เบเปเบฒเบฅเบฑเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบขเบนเปˆ.

void
PrintContext()
เบฅเบฐเบซเบฑเบ”:
I32 gimme = GIMME_V;
เบ–เป‰เบฒ (gimme == G_VOID)
printf ("เป€เบ™เบทเป‰เบญเปƒเบ™เป€เบ›เบฑเบ™เป‚เบกเบ„เบฐ\n");
เบญเบทเปˆเบ™เบ–เป‰เบฒ (gimme == G_SCALAR)
printf ("เป€เบ™เบทเป‰เบญเปƒเบ™เปเบกเปˆเบ™ Scalar\n");
เบญเบทเปˆเบ™
printf ("เบšเปเบฅเบดเบšเบปเบ”เปเบกเปˆเบ™ Array\n");

เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™ Perl เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบˆเบฐเบ—เบปเบ”เบชเบญเบšเบกเบฑเบ™.

PrintContext;
$a = PrintContext;
@a = PrintContext;

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเบฒเบเบ™เบฑเป‰เบ™เบˆเบฐเป€เบ›เบฑเบ™

เบšเปเบฅเบดเบšเบปเบ”เปเบกเปˆเบ™ Void
เบšเปเบฅเบดเบšเบปเบ”เปเบกเปˆเบ™ Scalar
เบšเปเบฅเบดเบšเบปเบ”เปเบกเปˆเบ™ Array

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Perl to เบ–เบดเป‰เบก of เบŠเบปเปˆเบงเบ„เบฒเบง
เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเปƒเบซเป‰เบกเบฒเป€เบ–เบดเบ‡เบ›เบฐเบˆเบธเบšเบฑเบ™, เบŠเบปเปˆเบงเบ„เบฒเบงเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™เบเบฒเบ™เป‚เบ—เบเบฑเบšเบ„เบทเบ™ (ie, เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต
เบœเปˆเบฒเบ™ stack เป„เบ”เป‰ เป‚เบ—_* function เบซเบผเบทเบ„เปˆเบฒเบชเบปเปˆเบ‡เบ„เบทเบ™เบœเปˆเบฒเบ™ stack) เป„เบ”เป‰
เบ›เบปเบ”เบ›เปˆเบญเบเป‚เบ”เบเบซเบ™เบถเปˆเบ‡เปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰:

ยท เบเบฒเบ™เบฅเบฐเบšเบธเบ—เบธเบ‡ G_DISCARD เบเบฑเบš เป‚เบ—_*

ยท เบเบฒเบ™เปƒเบŠเป‰เบเบฒเบ™เบˆเบฑเบšเบ„เบนเปˆ "ENTER"/"SAVETMPS"--"FREETMPS"/"LEAVE" เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™

เบกเบตเบงเบดเบ—เบตเบญเบทเปˆเบ™เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เป„เบ”เป‰, เบ„เบทเบเบฒเบ™เปƒเบซเป‰ Perl เป€เบฎเบฑเบ”เบกเบฑเบ™เปƒเบซเป‰เบ—เปˆเบฒเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”
เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆเบกเบฑเบ™เบ„เบงเบšเบ„เบธเบกเบ„เบทเบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เป‚เบ—เบเบฑเบšเบ„เบทเบ™เป„เบ”เป‰เบชเบดเป‰เบ™เบชเบธเบ”เบฅเบปเบ‡. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเบžเบฝเบ‡เปเบ•เปˆเบšเปเปˆ
เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰

ENTER;
SAVETMPS;
...
FREETMPS;
เบญเบญเบเบˆเบฒเบ;

เบฅเปเบฒเบ”เบฑเบšเปƒเบ™เบเบฒเบ™เป€เบญเบตเป‰เบ™เบ„เบทเบ™ (เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™, เปเบ™เปˆเบ™เบญเบ™, เบเบฒเบ™เบฅเบฐเบšเบธเบ—เบธเบ‡ G_DISCARD).

เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบ—เปˆเบฒเบ™โ€‹เบˆเบฐโ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ™เบตเป‰โ€‹, เบ—เปˆเบฒเบ™โ€‹เบˆเบฐโ€‹เบ•เป‰เบญเบ‡โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบฎเบนเป‰โ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เบฎเบปเปˆเบงโ€‹เป„เบซเบฅโ€‹เบ‚เบญเบ‡โ€‹เบ„เบงเบฒเบกโ€‹เบŠเบปเบ‡โ€‹เบˆเปเบฒโ€‹เบ—เบตเปˆโ€‹เป€เบ›เบฑเบ™โ€‹เป„เบ›โ€‹เป„เบ”เป‰โ€‹
เบชเบฒเบกเบฒเบ”เป€เบเบตเบ”เบ‚เบทเป‰เบ™เบžเบฒเบเปƒเบ•เป‰เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบชเบฐเป€เบžเบฒเบฐเบซเบผเบฒเบ. เป€เบžเบทเปˆเบญเบญเบฐเบ—เบดเบšเบฒเบเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰
เบฎเบนเป‰เป€เบฅเบฑเบเบ™เป‰เบญเบเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เป„เบซเบผเป€เบ‚เบปเป‰เบฒเบ‚เบญเบ‡เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบฅเบฐเบซเบงเปˆเบฒเบ‡ Perl เปเบฅเบฐเบเบฒเบ™เป€เบญเบตเป‰เบ™เบ„เบทเบ™เบ›เบปเบเบเบฐเบ•เบด.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเปƒเบซเป‰เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เป€เบญเบเบฐเบชเบฒเบ™ (เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบฅเบฐเป€เบซเบ”เบเบฒเบ™เบ—เบตเปˆเบ‚เบฑเบšเป€เบ„เบทเปˆเบญเบ™
เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹) เปเบกเปˆเบ™โ€‹เบ›เบปเบโ€‹เบเบฐโ€‹เบ•เบดโ€‹เบ‚เบญเบ‡โ€‹เบชเบญเบ‡โ€‹เบ›เบฐโ€‹เป€เบžเบ”โ€‹เบ•เบปเป‰เบ™โ€‹เบ•เปโ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ„เบงเบšโ€‹เบ„เบธเบกโ€‹เบเบฒเบ™โ€‹เป„เบซเบผโ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹เบกเบตโ€‹เปเบ™เบงโ€‹เป‚เบ™เป‰เบกโ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹
เบžเบปเบšเบเบฑเบšเบเบฒเบ™เป‚เบ—เบเบฑเบš. เบกเบตเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบซเบผเบฒเบเบฅเบฐเบซเบงเปˆเบฒเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ, เบชเบฐเบ™เบฑเป‰เบ™เบˆเปˆเบฒเบ
เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆ.

เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เปเบฒเบญเบดเบ”, เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”, เบเบฒเบ™เป„เบซเบผเป€เบ‚เบปเป‰เบฒเบ‚เบญเบ‡เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰. เป€เบˆเบปเป‰เบฒโ€‹เบกเบต
เบชเป‰เบฒเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบเบฑเบšเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบžเบฒเบเบ™เบญเบ. เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบชเบฒเบกเบฒเบ”เบšเบฑเบ™เบฅเบธเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบžเบฒเบเบ™เบญเบเป€เบŠเบฑเปˆเบ™
เบ™เบตเป‰

perl --> XSUB --> เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เบžเบฒเบเบ™เบญเบ

เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบขเบนเปˆเปƒเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”, เบชเบฐเบžเบฒเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เป€เบเบตเบ”เบ‚เบทเป‰เบ™. เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เบ—เปˆเบฒเบ™เป„เบ”เป‰เบ•เบฑเป‰เบ‡ a
Perl callback เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบเบฒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ™เบตเป‰, เบชเบฐเบ™เบฑเป‰เบ™เบกเบฑเบ™เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”. เป€เบกเบทเปˆเบญเบกเบตเบเบฒเบ™เป‚เบ—เบเบฑเบš
เบชเปเบฒเป€เบฅเบฑเบ”เปเบฅเป‰เบง, เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบˆเบฐเบซเบผเบธเบ”เบฅเบปเบ‡เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™ Perl เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡. เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบเบฒเบ™เป„เบซเบผเป€เบ‚เบปเป‰เบฒเบ‚เบญเบ‡เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบˆเบฐเป€เบ›เบฑเบ™
เบ„เบทเบเบฑเบšเปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ™เบฑเป‰เบ™

perl --> XSUB --> เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เบžเบฒเบเบ™เบญเบ
...
เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹เป€เบเบตเบ”โ€‹เบ‚เบถเป‰เบ™โ€‹
...
เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เบžเบฒเบเบ™เบญเบ --> call_* --> perl
|
perl <-- XSUB <-- เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เบžเบฒเบเบ™เบญเบ <-- call_* <----+

เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡โ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹ เป‚เบ—_* เบชเปเบฒเป€เบฅเบฑเบ”เปเบฅเป‰เบง, เบเบฒเบ™เบ„เบงเบšเบ„เบธเบก reverts เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™ Perl เบซเบผเบฒเบ
เบซเบผเบทเบซเบ™เป‰เบญเบเบฅเบปเบ‡เบ—เบฑเบ™เบ—เบต.

เปƒเบ™เปเบœเบ™เบงเบฒเบ”, เบชเบดเบ”เบ—เบดเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ—เบตเปˆเบ—เปˆเบฒเบ™เป„เบ›, เบ‚เบญเบšเป€เบ‚เบ”เบ—เบตเปˆเบเบฑเบ‡เป€เบฅเบดเบเบซเบผเบฒเบเปเบกเปˆเบ™. เบกเบฑเบ™เป€เบ›เบฑเบ™เบžเบฝเบ‡เปเบ•เปˆ
เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเปเบกเปˆเบ™เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™เบ—เบตเปˆเบกเบต perl เบขเบนเปˆเป€เบšเบทเป‰เบญเบ‡เบŠเป‰เบฒเบเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เปเบœเบ™เบงเบฒเบ”เบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเบฐเบกเบต
เบซเบผเบธเบ”เบฅเบปเบ‡เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™เบ‚เบญเบšเป€เบ‚เบ”เบเบฒเบ™เบ›เบดเบ”เบฅเป‰เบญเบกเปเบฅเบฐเบŠเบปเปˆเบงเบ„เบฒเบงเปƒเบ”เป†เบ—เบตเปˆเบ—เปˆเบฒเบ™เป„เบ”เป‰เบ›เบฐเป„เบงเป‰ hanging เบ›เบฐเบกเบฒเบ™เบˆเบฐ
เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบปเบ”เบ›เปˆเบญเบ.

เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเบชเบญเบ‡, เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบฑเบšเป€เบ„เบทเปˆเบญเบ™เป€เบซเบ”เบเบฒเบ™, เบเบฒเบ™เป„เบซเบผเป€เบ‚เบปเป‰เบฒเบ‚เบญเบ‡เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบˆเบฐเป€เบ›เบฑเบ™เปเบšเบšเบ™เบตเป‰

perl --> XSUB --> เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เป€เบซเบ”เบเบฒเบ™
...
เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เป€เบซเบ”เบเบฒเบ™ --> call_* --> perl
|
เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เป€เบซเบ”เบเบฒเบ™ <-- call_* <----+
...
เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เป€เบซเบ”เบเบฒเบ™ --> call_* --> perl
|
เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เป€เบซเบ”เบเบฒเบ™ <-- call_* <----+
...
เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เป€เบซเบ”เบเบฒเบ™ --> call_* --> perl
|
เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เป€เบซเบ”เบเบฒเบ™ <-- call_* <----+

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบเบฒเบ™เป„เบซเบผเบ‚เบญเบ‡เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบชเบฒเบกเบฒเบ”เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบžเบฝเบ‡เปเบ•เปˆเบฅเปเบฒเบ”เบฑเบšเบŠเป‰เปเบฒเบŠเป‰เบญเบ™

เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เป€เบซเบ”เบเบฒเบ™ --> call_* --> perl

เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ—เบตเปˆเบชเบปเบกเบšเบนเบ™เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบญเบฒเบ”เบˆเบฐ เบšเปเปˆเป€เบ„เบตเบ
เบเบฑเบšเบ„เบทเบ™เป„เบ›เบซเบฒเบ‚เบญเบšเป€เบ‚เบ”เบญเป‰เบญเบกเบ‚เป‰เบฒเบ‡เปƒเบ™ Perl เบขเบนเปˆเป€เบšเบทเป‰เบญเบ‡เบŠเป‰เบฒเบเบ—เบตเปˆเบชเบธเบ”.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบšเบฑเบ™เบซเบฒเปƒเบซเบเปˆเปเบกเปˆเบ™เบซเบเบฑเบ‡? เบ”เบต, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ„เบฒเบ”เบซเบงเบฑเบ‡เบงเปˆเบฒ Perl เบˆเบฐเบˆเบฑเบ”เบฅเบฐเบšเบฝเบšเบŠเบปเปˆเบงเบ„เบฒเบงเป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™
เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™, เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบฅเปเบ–เป‰เบฒเบ”เบปเบ™เบ™เบฒเบ™. เป€เบžเบทเปˆเบญเปƒเบซเป‰ Perl เบเปเบฒเบˆเบฑเบ”เบเบฒเบ™เบŠเบปเปˆเบงเบ„เบฒเบงเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ,
เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบ•เป‰เบญเบ‡เบเบฑเบšเบ„เบทเบ™เบชเบนเปˆเบ‚เบญเบšเป€เบ‚เบ”เบเบฒเบ™เบ›เบดเบ”เบฅเป‰เบญเบกเปƒเบ™เบšเบฒเบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™. เบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเบ‚เบฑเบšเป€เบ„เบทเปˆเบญเบ™เป€เบซเบ”เบเบฒเบ™
เบ—เบตเปˆเบญเบฒเบ”เบˆเบฐเบšเปเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ, เป€เบกเบทเปˆเบญเป€เบงเบฅเบฒเบœเปˆเบฒเบ™เป„เบ›, เป‚เบ›เบผเปเบเบผเบกเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบˆเบฐเบชเป‰เบฒเบ‡เบซเบผเบฒเบเบ‚เบถเป‰เบ™
เปเบฅเบฐโ€‹เบŠเบปเปˆเบงโ€‹เบ„เบฒเบงโ€‹เบซเบผเบฒเบโ€‹เบเบงเปˆเบฒโ€‹เป€เบเบปเปˆเบฒ, เบšเปเปˆโ€‹เบกเบตโ€‹เบญเบฑเบ™โ€‹เปƒเบ”โ€‹เบˆเบฐโ€‹เบ–เบทเบโ€‹เบ›เบปเบ”โ€‹เบ›เปˆเบญเบ. เปƒเบ™เบ–เบฒเบ™เบฐเป€เบ›เบฑเบ™เปเบ•เปˆเบฅเบฐเบŠเบปเปˆเบงเบ„เบฒเบงเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰
เบšเปเบฅเบดเป‚เบžเบเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบšเบฒเบ‡เบขเปˆเบฒเบ‡ เป‚เบ›เบผเปเบเบผเบกเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบเปเบˆเบฐเปƒเบŠเป‰เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบ—เบฑเบ‡เปเบปเบ”เบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ
เบฅเบฐเบšเบปเบš--kapow!

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ™เบตเป‰เปเบกเปˆเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบฅเบธเปˆเบก - เบ–เป‰เบฒเบ—เปˆเบฒเบ™เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบˆเบฐเบเบฑเบšเบ„เบทเบ™เบชเบนเปˆเบเบฒเบ™เบ›เบดเบ”เบฅเป‰เบญเบก
เบ‚เบญเบšเป€เบ‚เบ” Perl เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เป„เบงเบซเบผเบฑเบ‡เบˆเบฒเบเบชเบดเป‰เบ™เบชเบธเบ”เบเบฒเบ™เป‚เบ—เบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™เปเบ—เป‰เป†
เบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบตเปˆเบˆเบฐเบเปเบฒเบˆเบฑเบ”เบเบฒเบ™เบŠเบปเปˆเบงเบ„เบฒเบงเบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบญเบฒเบ”เบˆเบฐเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบขเปˆเบฒเบ‡เบˆเบฐเปเบˆเป‰เบ‡. เปƒเบˆเป€เบˆเบปเป‰เบฒ, เบ–เป‰เบฒเป€เบˆเบปเป‰เบฒ
เบกเบตเบ„เบงเบฒเบกเบšเปเปˆเปเบ™เปˆเปƒเบˆเบเปˆเบฝเบงเบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”, เบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เป€เบ›เบฑเบ™เบญเบฑเบ™เบ•เบฐเบฅเบฒเบเปƒเบ”เป†เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เป€เบ›เบฑเบ™เบฅเบฐเบšเบฝเบšเบฎเบฝเบšเบฎเป‰เบญเบ.

เปเบœเบ™เบเบธเบ”เบ—เบฐเบชเบฒเบ” เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบงเป‰ เป‚เบ— Context เบ‚เปเป‰เบกเบนเบ™เบ‚เปˆเบฒเบงเบชเบฒเบ™
เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบšเบฑเบ™เบซเบฒ trickiest เบ—เบตเปˆเบˆเบฐเป€เบญเบปเบฒเบŠเบฐเบ™เบฐเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เบญเบญเบเปเบšเบšเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบเบฒเบ™เป‚เบ—เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™
เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบงเบดเบ—เบตเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเปเบœเบ™เบ—เบตเปˆเบฅเบฐเบซเบงเปˆเบฒเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™ C callback เปเบฅเบฐ Perl
เบ—เบฝเบšเป€เบ—เบปเปˆเบฒ.

เป€เบžเบทเปˆเบญเบŠเปˆเบงเบเปƒเบซเป‰เป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบญเบฑเบ™เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบ—เปเบฒเบญเบดเบ”เปƒเบซเป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบงเบดเบ—เบตเบเบฒเบ™เป‚เบ—เบซเบฒเบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™
เปƒเบ™โ€‹เบชเบฐโ€‹เบžเบฒเบšโ€‹เปเบงเบ”โ€‹เบฅเป‰เบญเบก C เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹. เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบด C API เบˆเบฐเปƒเบซเป‰เบŸเบฑเบ‡เบŠเบฑเบ™เป€เบžเบทเปˆเบญเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™ a
เป‚เบ—โ€‹เบเบฑเบš. เบ™เบตเป‰เบˆเบฐเบ„เบฒเบ”เบซเบงเบฑเบ‡เบงเปˆเบฒเบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™. เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™ a
เป‚เบ—เบซเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเบชเบปเบกเบกเบธเบ”เบ•เบดเบ–เบฒเบ™ "register_fatal" เป€เบŠเบดเปˆเบ‡เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบŸเบฑเบ‡เบŠเบฑเบ™ C เบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบš
เป€เบญเบตเป‰เบ™เบงเปˆเบฒเป€เบกเบทเปˆเบญเบกเบตเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบฎเป‰เบฒเบเปเบฎเบ‡เป€เบเบตเบ”เบ‚เบถเป‰เบ™.

register_fatal(cb1);

เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ”เบฝเบง "cb1" เปเบกเปˆเบ™เบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเปเบฒเบ™เบปเบ” "cb1" เปƒเบ™.
เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ, เป€เบงเบปเป‰เบฒเปเบšเบšเบ™เบตเป‰

void static
cb1()
{
printf ("เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบฎเป‰เบฒเบเปเบฎเบ‡\n");
เบเบฒเบ™เบ—เปˆเบญเบ‡เบ—เปˆเบฝเบง(1)
}

เบ•เบญเบ™เบ™เบตเป‰เบ›เปˆเบฝเบ™เบญเบฑเบ™เบ™เบฑเป‰เบ™เป„เบ›เป€เบญเบตเป‰เบ™เป€เบ›เบฑเบ™เบฅเบฒเบเบเบฒเบ™เบเปˆเบญเบ Perl เปเบ—เบ™

static SV * callback = (SV*)NULL;

void static
cb1()
{
dSP;

PUSHMARK(SP);

/* เป‚เบ—โ€‹เบซเบฒ Perl sub เป€เบžเบทเปˆเบญโ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡โ€‹เบเบฒเบ™โ€‹เป‚เบ—โ€‹เบเบฑเบš */
call_sv(callback, G_DISCARD);
}

void
register_fatal(fn)
SV * fn
เบฅเบฐเบซเบฑเบ”:
/* เบˆเบทเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบเปˆเบญเบ Perl */
เบ–เป‰เบฒ (เป‚เบ—เบเบฑเบš == (SV*)NULL)
callback = newSVsv(fn);
เบญเบทเปˆเบ™
SvSetSV(เป‚เบ—เบเบฑเบš, fn);

/* เบฅเบปเบ‡โ€‹เบ—เบฐโ€‹เบšเบฝเบ™โ€‹เบเบฒเบ™โ€‹เป‚เบ—โ€‹เบเบฑเบšโ€‹เบซเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบธเบ”โ€‹เบžเบฒเบโ€‹เบ™เบญเบ */
register_fatal(cb1);

เบšเปˆเบญเบ™เบ—เบตเปˆ Perl เบ—เบฝเบšเป€เบ—เบปเปˆเบฒเบเบฑเบš "register_fatal" เปเบฅเบฐเบเบฒเบ™เป€เบญเบตเป‰เบ™เบ„เบทเบ™เบ—เบตเปˆเบกเบฑเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™, "pcb1", เบญเบฒเบ”เบˆเบฐ.
เป€เบšเบดเปˆเบ‡เปเบšเบšเบ™เบตเป‰

#เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบเปˆเบญเบ pcb1
register_fatal(\&pcb1);

เบเปˆเบญเบ pcb1
{
เบ•เบฒเบ "เบ‚เป‰เบญเบเบเบณเบฅเบฑเบ‡เบˆเบฐเบ•เบฒเบ...\n";
}

เบเบฒเบ™เบชเป‰เบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบฅเบฐเบซเบงเปˆเบฒเบ‡ C callback เปเบฅเบฐ Perl เบ—เบฝเบšเป€เบ—เบปเปˆเบฒเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เบ—เบปเปˆเบงเป‚เบฅเบ
เบ•เบปเบงเปเบ› "เป‚เบ—เบเบฑเบš".

เบ™เบตเป‰เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบžเบฝเบ‡เบžเปเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบซเป‰เบกเบตเบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบเบฒเบ™เป‚เบ—เบเบฑเบšเบ„เบฑเป‰เบ‡เบ”เบฝเบงเป„เบ”เป‰เบ—เบธเบเป€เบงเบฅเบฒ.
เบ•เบปเบงเบขเปˆเบฒเบ‡เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ„เบทเบเบฑเบšเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบชเบฐเปเบ”เบ‡เบขเบนเปˆเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡. เบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒ,
เบเบฒเบ™เป‚เบ—เบŠเป‰เบณเป†เป„เบ›เบซเบฒ "register_fatal" เบˆเบฐเบ›เปˆเบฝเบ™เปเบ—เบ™เบเบฒเบ™เป‚เบ—เบเบฑเบšเบ—เบตเปˆเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบเปˆเบญเบ™เปœเป‰เบฒเบ™เบตเป‰
เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบญเบฑเบ™เปƒเบซเบกเปˆ.

เป€เบงเบปเป‰เบฒเบ•เบปเบงเบขเปˆเบฒเบ‡เบงเปˆเบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบเบฑเบšเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เป„เบŸเบฅเปŒ asynchronous i/o. เปƒเบ™
เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบชเบฒเบกเบฒเบ”เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบเบฒเบ™เป‚เบ—เบซเบฒเบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบญเปˆเบฒเบ™เบชเปเบฒเป€เบฅเบฑเบ”.
เป€เบžเบทเปˆเบญเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบชเบฒเบกเบฒเบ”เป‚เบ—เบซเบฒ subroutines Perl เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเป„เบŸเบฅเปŒเบ—เบตเปˆ
เบ–เบทเบเป€เบ›เบตเบ”. เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบกเบฑเบ™เบขเบทเบ™เบขเบนเปˆ, เบ•เบปเบงเบขเปˆเบฒเบ‡เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบˆเบฐเบšเปเปˆเบžเบฝเบ‡เบžเปเบเป‰เบญเบ™เบงเปˆเบฒเบกเบฑเบ™
เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เปƒเบซเป‰โ€‹เบกเบตโ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆ callback เบ”เบฝเบงโ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เป„เบ”เป‰โ€‹เบ—เบธเบโ€‹เป€เบงโ€‹เบฅเบฒโ€‹. เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™
เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเปเบœเบ™เบ—เบตเปˆเบฅเบฐเบซเบงเปˆเบฒเบ‡เป„เบŸเบฅเปŒเบ—เบตเปˆเป€เบ›เบตเบ”เปเบฅเบฐ Perl subroutine เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบญเบตเป‰เบ™เบงเปˆเบฒ
เบชเปเบฒเบฅเบฑเบšเป„เบŸเบฅเปŒเบ™เบฑเป‰เบ™.

เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” i/o เบกเบตเบŸเบฑเบ‡เบŠเบฑเบ™ "asynch_read" เป€เบŠเบดเปˆเบ‡เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบเบฑเบšเบŸเบฑเบ‡เบŠเบฑเบ™ C
"ProcessRead" เบเบฑเบšเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เป„เบŸเบฅเปŒ "fh"-- เบ™เบตเป‰เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบกเบฑเบ™เป„เบ”เป‰เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบ›เบปเบเบเบฐเบ•เบดเบšเบฒเบ‡เบขเปˆเบฒเบ‡.
เป€เบžเบทเปˆเบญโ€‹เป€เบ›เบตเบ”โ€‹เป„เบŸเบฅโ€‹เปŒโ€‹เปเบฅเบฐโ€‹เบชเบฐโ€‹เบ™เบฑเป‰เบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบˆเบฑเบšโ€‹เป„เบŸเบฅโ€‹เปŒโ€‹.

asynch_read(fh, ProcessRead)

เบ™เบตเป‰โ€‹เบญเบฒเบ”โ€‹เบˆเบฐโ€‹เบ„เบฒเบ”โ€‹เบงเปˆเบฒโ€‹เบˆเบฐ C ProcessRead เบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡เปเบšเบšเบŸเบญเบกเบ™เบตเป‰

void
ProcessRead(fh, buffer)
int fh;
char * buffer;
{
...
}

เป€เบžเบทเปˆเบญเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš Perl เปƒเบซเป‰เบเบฑเบšเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบฅเบฐเบซเบงเปˆเบฒเบ‡ "fh" เป„เบ”เป‰.
เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเปเบฅเบฐ perl subroutine เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบญเบตเป‰เบ™เบงเปˆเบฒ. A hash เป€เบ›เบฑเบ™เบเบปเบ™เป„เบเบ—เบตเปˆเบชเบฐเบ”เบงเบเบชเปเบฒเบฅเบฑเบš
เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเปเบœเบ™เบ—เบตเปˆเบ™เบตเป‰. เบฅเบฐเบซเบฑเบ”เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰

static HV * Mapping = (HV*)NULL;

void
asynch_read(fh, callback)
int fh
SV * เป‚เบ—เบเบฑเบš
เบฅเบฐเบซเบฑเบ”:
/* เบ–เป‰เบฒ hash เบšเปเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง, เบชเป‰เบฒเบ‡เบกเบฑเบ™ */
เบ–เป‰เบฒ (เปเบœเบ™เบ—เบตเปˆ == (HV*)NULL)
เปเบœเบ™เบ—เบตเปˆ = newHV();

/* เบšเบฑเบ™เบ—เบถเบ fh -> callback mapping */
hv_store(mapping, (char*)&fh, sizeof(fh), newSVsv(callback), 0);

/* เบฅเบปเบ‡โ€‹เบ—เบฐโ€‹เบšเบฝเบ™โ€‹เบเบฑเบš C Library */
asynch_read(fh, asynch_read_if);

เปเบฅเบฐ "asynch_read_if" เบชเบฒเบกเบฒเบ”เบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ™เบตเป‰

void static
asynch_read_if(fh, buffer)
int fh;
char * buffer;
{
dSP;
SV** sv;

/* เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เป‚เบ—โ€‹เบเบฑเบšโ€‹เบ„เบทเบ™โ€‹เบ—เบตเปˆโ€‹เบเปˆเบฝเบงโ€‹เบ‚เป‰เบญเบ‡โ€‹เบเบฑเบš fh */
sv = hv_fetch(เปเบœเบ™เบ—เบตเปˆ, (char*)&fh , sizeof(fh), FALSE);
เบ–เป‰เบฒ (sv == (SV**)NULL)
croak("เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบžเบฒเบเปƒเบ™...\n");

PUSHMARK(SP);
XPUSHs(sv_2mortal(newSViv(fh)));
XPUSHs(sv_2mortal(newSVpv(buffer, 0)));
PUTBACK;

/* เป‚เบ—โ€‹เบซเบฒ Perl sub */
call_sv(*sv, G_DISCARD);
}

เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบชเบปเบกเบšเบนเบ™, เบ™เบตเป‰เปเบกเปˆเบ™ "asynch_close". เบ™เบตเป‰เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเบดเบ—เบตเบเบฒเบ™เป€เบญเบปเบฒเบฅเบฒเบเบเบฒเบ™เบญเบญเบเบˆเบฒเบ
hash "เปเบœเบ™เบ—เบตเปˆ".

void
asynch_close(fh)
int fh
เบฅเบฐเบซเบฑเบ”:
/* เป€เบญเบปเบฒโ€‹เบเบฒเบ™โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เบˆเบฒเบ hash */
(void) hv_delete(Mapping, (char*)&fh, sizeof(fh), G_DISCARD);

/* เบ”เบฝเบงเบ™เบตเป‰เป‚เบ—เบซเบฒ asynch_close เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡ */
asynch_close(fh);

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš Perl เบˆเบฐเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ™เบตเป‰

เป‚เบ—โ€‹เบเบฑเบšโ€‹เบเปˆเบญเบ 1
{
my($handle, $buffer) = @_;
}

# เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบเบฒเบ™เป‚เบ—เบ„เบทเบ™ Perl
asynch_read($fh, \&callback1);

asynch_close($fh);

เบเบฒเบ™โ€‹เบชเป‰เบฒเบ‡โ€‹เปเบœเบ™โ€‹เบ—เบตเปˆโ€‹เบฅเบฐโ€‹เบซเบงเปˆเบฒเบ‡ C callback เปเบฅเบฐ Perl เบ–เบทเบโ€‹เป€เบเบฑเบšโ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เป„เบงเป‰โ€‹เปƒเบ™ hash เบ—เบปเปˆเบงโ€‹เป‚เบฅเบ "เบเบฒเบ™โ€‹เบชเป‰เบฒเบ‡โ€‹เปเบœเบ™โ€‹เบ—เบตเปˆโ€‹" เบ™เบตเป‰โ€‹
เป€เบงเบฅเบฒ. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ hash เบกเบตเบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบ—เบตเปˆเบกเบฑเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบˆเปเบฒเบ™เบงเบ™เบšเปเปˆเบˆเปเบฒเบเบฑเบ”
เป‚เบ—เบเบฑเบšเบ„เบทเบ™เบ—เบตเปˆเบˆเบฐเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™.

เบˆเบฐเป€เบ›เบฑเบ™เปเบ™เบงเปƒเบ”เบ–เป‰เบฒเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เป‚เบ”เบ C callback เบšเปเปˆเบกเบตเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰
เป„เบŸเบฅเปŒเบˆเบฑเบ”เบเบฒเบ™เบเบฑเบš Perl subroutine mapping? เป€เบงเบปเป‰เบฒเปƒเบ™เปเบžเบฑเบเป€เบเบฑเบ” i/o asynchronous, the
เบŸเบฑเบ‡เบŠเบฑเบ™ callback เป„เบ”เป‰เบฎเบฑเบšเบžเบฝเบ‡เปเบ•เปˆ "buffer" เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเป€เบŠเบฑเปˆเบ™เบ™เบตเป‰

void
ProcessRead(buffer)
char * buffer;
{
...
}

เบ–เป‰เบฒเบšเปเปˆเบกเบตเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เป„เบŸเบฅเปŒเปเบกเปˆเบ™เบšเปเปˆเบกเบตเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบปเบ‡เป„เบ›เบเบปเบ‡เบกเบฒเปƒเบ™เปเบœเบ™เบ—เบตเปˆเบˆเบฒเบ C callback เบเบฑเบš the
Perl subroutine.

เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ™เบตเป‰โ€‹เบงเบดโ€‹เบ—เบตโ€‹เบ—เบตเปˆโ€‹เป€เบ›เบฑเบ™โ€‹เป„เบ›โ€‹เป„เบ”เป‰โ€‹เบ›เบฐโ€‹เบกเบฒเบ™โ€‹เบšเบฑเบ™โ€‹เบซเบฒโ€‹เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบเบฒเบ™โ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เป„เบงเป‰โ€‹เบฅเปˆเบงเบ‡โ€‹เบซเบ™เป‰เบฒโ€‹เบŠเบธเบ”โ€‹เบ‚เบญเบ‡ C เบซเบ™เป‰เบฒโ€‹เบ—เบตเปˆโ€‹เป€เบ›เบฑเบ™โ€‹
เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ›เบฑเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบเบฑเบš Perl, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™

#เบเบณเบ™เบปเบ” MAX_CB 3
#define NULL_HANDLE -1
typedef void (*FnMap)();

เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เปเบœเบ™เบ—เบตเปˆ {
เบŸเบฑเบ‡เบŠเบฑเบ™ FnMap;
SV * PerlSub;
int Handle;
};

static void fn1();
static void fn2();
static void fn3();

static struct MapStruct Map [MAX_CB] =
{
{ fn1, NULL, NULL_HANDLE },
{ fn2, NULL, NULL_HANDLE },
{ fn3, NULL, NULL_HANDLE }
};

void static
Pcb(เบ”เบฑเบ”เบŠเบฐเบ™เบต, buffer)
int เบ”เบฑเบ”เบŠเบฐเบ™เบต;
char * buffer;
{
dSP;

PUSHMARK(SP);
XPUSHs(sv_2mortal(newSVpv(buffer, 0)));
PUTBACK;

/* เป‚เบ—โ€‹เบซเบฒ Perl sub */
call_sv(เปเบœเบ™เบ—เบตเปˆ[index].PerlSub, G_DISCARD);
}

void static
fn1(buffer)
char * buffer;
{
Pcb(0, buffer);
}

void static
fn2(buffer)
char * buffer;
{
Pcb(1, buffer);
}

void static
fn3(buffer)
char * buffer;
{
Pcb(2, buffer);
}

void
array_asynch_read(fh, callback)
int fh
SV * เป‚เบ—เบเบฑเบš
เบฅเบฐเบซเบฑเบ”:
int เบ”เบฑเบ”เบŠเบฐเบ™เบต;
int null_index = MAX_CB;

/* เบŠเบญเบโ€‹เบซเบฒโ€‹เบ•เบปเบงโ€‹เบˆเบฑเบšโ€‹เบ”เบฝเบงโ€‹เบเบฑเบ™โ€‹เบซเบผเบทโ€‹เบเบฒเบ™โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป€เบ›เบปเปˆเบฒ */
เบชเปเบฒเบฅเบฑเบš (index = 0; index < MAX_CB; ++index)
{
เบ–เป‰เบฒ (เปเบœเบ™เบ—เบตเปˆ[index]. เบˆเบฑเบ”เบเบฒเบ™ == fh)
เบ—เปเบฒเบฅเบฒเบ;

เบ–เป‰เบฒ (เปเบœเบ™เบ—เบตเปˆ[index].เบˆเบฑเบ”เบเบฒเบ™ == NULL_HANDLE)
null_index = เบ”เบฑเบ”เบŠเบฐเบ™เบต;
}

เบ–เป‰เบฒ (เบ”เบฑเบ”เบŠเบฐเบ™เบต == MAX_CB && null_index == MAX_CB)
croak ("เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบŸเบฑเบ‡เบŠเบฑเบ™เป‚เบ—เบเบฑเบšเบซเบผเบฒเบเป€เบเบตเบ™เป„เบ›\n");

เบ–เป‰เบฒ (เบ”เบฑเบ”เบŠเบฐเบ™เบต == MAX_CB)
index = null_index;

/* เบšเบฑเบ™โ€‹เบ—เบถเบโ€‹เป„เบŸเบฅโ€‹เปŒ handle */
เปเบœเบ™เบ—เบตเปˆ[index].Handle = fh;

/* เบˆเบทเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบเปˆเบญเบ Perl */
เบ–เป‰เบฒ (เปเบœเบ™เบ—เบตเปˆ[index].PerlSub == (SV*)NULL)
เปเบœเบ™เบ—เบตเปˆ[index].PerlSub = newSVsv(callback);
เบญเบทเปˆเบ™
SvSetSV(เปเบœเบ™เบ—เบตเปˆ[index].PerlSub, callback);

asynch_read(fh, เปเบœเบ™เบ—เบตเปˆ[index].Function);

void
array_asynch_close(fh)
int fh
เบฅเบฐเบซเบฑเบ”:
int เบ”เบฑเบ”เบŠเบฐเบ™เบต;

/* เบŠเบญเบเบซเบฒเบ•เบปเบงเบˆเบฑเบšเป„เบŸเบฅเปŒ */
เบชเปเบฒเบฅเบฑเบš (index = 0; index < MAX_CB; ++ index)
เบ–เป‰เบฒ (เปเบœเบ™เบ—เบตเปˆ[index]. เบˆเบฑเบ”เบเบฒเบ™ == fh)
เบ—เปเบฒเบฅเบฒเบ;

เบ–เป‰เบฒ (เบ”เบฑเบ”เบŠเบฐเบ™เบต == MAX_CB)
croak ("เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ›เบดเบ” fh %d\n", fh);

เปเบœเบ™เบ—เบตเปˆ[index].เบˆเบฑเบ”เบเบฒเบ™ = NULL_HANDLE;
SvREFCNT_dec(เปเบœเบ™เบ—เบตเปˆ[index].PerlSub);
เปเบœเบ™เบ—เบตเปˆ[index].PerlSub = (SV*)NULL;

asynch_close(fh);

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบซเบ™เป‰เบฒเบ—เบตเปˆ "fn1", "fn2", เปเบฅเบฐ "fn3" เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบˆเบทเปˆเบˆเปเบฒ Perl.
subroutine เบ—เบตเปˆเบˆเบฐเป€เบญเบตเป‰เบ™เบงเปˆเบฒ. เปเบ•เปˆเบฅเบฐเบซเบ™เป‰เบฒเบ—เบตเปˆเบ–เบทเบ”เบฑเบ”เบชเบฐเบ™เบตเบชเบฒเบเปเบ‚เบ‡เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™
เปƒเบŠเป‰เปƒเบ™เบŸเบฑเบ‡เบŠเบฑเบ™ "Pcb" เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเบซเบฒ "เปเบœเบ™เบ—เบตเปˆ" array เปเบฅเบฐเบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบงเป‚เบ—เบซเบฒ Perl
เบ›เบฐเบˆเบณเบเปˆเบญเบ.

เบกเบตเบšเบฒเบ‡เบ‚เปเป‰เป€เบชเบเบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบเบฑเบšเป€เบ•เบฑเบเบ™เบดเบเบ™เบตเป‰.

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบฅเบฐเบซเบฑเบ”เปเบกเปˆเบ™เบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบเบเปˆเบงเบฒเบ•เบปเบงเบขเปˆเบฒเบ‡เบเปˆเบญเบ™ เปœเป‰เบฒ เบ™เบตเป‰.

เบญเบฑเบ™เบ—เบตเบชเบญเบ‡, เบกเบตเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเบกเบตเบชเบฒเบเปเบ‚เบ‡ (เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰ 3) เบเบฑเบšเบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เป‚เบ—เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™เบ—เบตเปˆเบชเบฒเบกเบฒเบ”
เบกเบตเบขเบนเปˆเบžเป‰เบญเบกเป†เบเบฑเบ™. เบงเบดเบ—เบตเบ”เบฝเบงเบ—เบตเปˆเบˆเบฐเป€เบžเบตเปˆเบกเบ‚เบตเบ”เบˆเปเบฒเบเบฑเบ”เปเบกเปˆเบ™เป‚เบ”เบเบเบฒเบ™เบ”เบฑเบ”เปเบ›เบ‡เบฅเบฐเบซเบฑเบ”เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบก
เบŸเบฑเบ‡เบŠเบฑเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ recompiling. เบšเปเปˆเบกเบตเบซเบ™เป‰เบญเบ, เบ•เบฒเบšเปƒเบ”เบ—เบตเปˆเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเปเบกเปˆเบ™
เป€เบฅเบทเบญเบเบ”เป‰เบงเบเบเบฒเบ™เบ”เบนเปเบฅเบšเบฒเบ‡เบขเปˆเบฒเบ‡, เบกเบฑเบ™เบเบฑเบ‡เป€เบ›เบฑเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เปเบฅเบฐเปƒเบ™เบšเบฒเบ‡เบเปเบฅเบฐเบ™เบตเปเบกเปˆเบ™เบญเบฑเบ™เบ”เบฝเบง
เบ—เบตเปˆเบกเบตเบขเบนเปˆ.

เป€เบžเบทเปˆเบญเบชเบฐเบซเบผเบธเบš, เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™เบ—เบตเปˆเบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ
เปเบœเบ™เบ—เบตเปˆเบฅเบฐเบซเบงเปˆเบฒเบ‡ C เปเบฅเบฐ Perl callback

1. เบšเปเปˆเบชเบปเบ™เปƒเบˆเบšเบฑเบ™เบซเบฒ - เบญเบฐเบ™เบธเบเบฒเบ”เบžเบฝเบ‡เปเบ•เปˆ 1 callback
เบชเปเบฒเบฅเบฑเบšเบซเบผเบฒเบเป†เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™, เป€เบŠเบฑเปˆเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบเบฑเบšเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”, เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™
เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบžเบฝเบ‡เบžเปเบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™.

2. เบชเป‰เบฒเบ‡เบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡ callbacks - hard wired limit
เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบšเบญเบเบˆเบฒเบเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™ C callback เปเบกเปˆเบ™เบซเบเบฑเบ‡
เบชเบฐเบžเบฒเบšเบเบฒเบ™เปเบกเปˆเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš C callback
เบŸเบฑเบ‡เบŠเบฑเบ™, เปเบฅเบฐเป€เบเบฑเบšเบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเปเบ•เปˆเบฅเบฐเบญเบฑเบ™เปƒเบ™เบญเบฒเป€เบฃ.

3. เปƒเบŠเป‰เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป€เบžเบทเปˆเบญเปเบœเบ™เบ—เบตเปˆเบเบฑเบšเบเบฒเบ™เป‚เบ—เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™ Perl
A hash เป€เบ›เบฑเบ™เบเบปเบ™เป„เบเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบ—เบตเปˆเบˆเบฐเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเปเบœเบ™เบ—เบตเปˆเบฅเบฐเบซเบงเปˆเบฒเบ‡ C เปเบฅเบฐ Perl.

เบ—เบฒเบ‡เป€เบฅเบทเบญเบ Stack เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™
เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ‚เป‰เบญเบเป„เบ”เป‰เปƒเบŠเป‰เบžเบฝเบ‡เปเบ•เปˆ "POP*" macros เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ„เปˆเบฒเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบกเบฒเบˆเบฒเบ Perl
subroutines, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐ bypass macro เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบฅเบฐเบญเปˆเบฒเบ™ stack เป‚เบ”เบเปƒเบŠเป‰ "ST"
macro (เป€เบšเบดเปˆเบ‡ perlxs เบชเปเบฒเบฅเบฑเบšเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบ•เบฑเบกเบ‚เบญเบ‡ "ST" macro).

เบชเปˆเบงเบ™เปƒเบซเบเปˆเบ‚เบญเบ‡เป€เบงเบฅเบฒ macro "POP*" เบ„เบงเบ™เบˆเบฐเบžเบฝเบ‡เบžเป; เบšเบฑเบ™เบซเบฒเบ•เบปเป‰เบ™เบ•เปเบเบฑเบšเบžเบงเบเป€เบ‚เบปเบฒเปเบกเปˆเบ™เบงเปˆเบฒ
เบžเบงเบเบกเบฑเบ™เบšเบฑเบ‡เบ„เบฑเบšเปƒเบซเป‰เบ—เปˆเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบปเปˆเบ‡เบกเบฒเบ•เบฒเบกเบฅเบณเบ”เบฑเบš. เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบšเปเปˆเปเบกเปˆเบ™เบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”
เบงเบดเบ—เบตเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเปƒเบ™เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบ„เบธเบ™เบ„เปˆเบฒเปƒเบ™เบšเบฒเบ‡เบเปเบฅเบฐเบ™เบต. เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰
stack เปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบชเบธเปˆเบก. เบกเบฐเบซเบฒเบžเบฒเบ "ST" เบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ” XSUB เปเบกเปˆเบ™เป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบชเบดเปˆเบ‡เบ™เบตเป‰
เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡.

เบฅเบฐเบซเบฑเบ”เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบžเบฒเบ เบเบฑเบšเบกเบฒ a เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบฅเบฒเบโ€‹เบŠเบทเปˆ of เบกเบนเบ™เบ„เปˆเบฒ recoded เป€เบ›เบฑเบ™
เปƒเบŠเป‰ "ST" เปเบ—เบ™ "POP*".

void static
call_AddSubtract2(a, b)
int a;
int b;
{
dSP;
I32 เบ•เบฑเบ”เบ—เบญเบ™เบฅเบฒเบเบˆเปˆเบฒเบ;
int เบ™เบฑเบš;

ENTER;
SAVETMPS;

PUSHMARK(SP);
XPUSHs(sv_2mortal(newSViv(a)));
XPUSHs(sv_2mortal(newSViv(b)));
PUTBACK;

count = call_pv("AddSubtract", G_ARRAY);

SPAGAIN;
SP -= เบ™เบฑเบš;
ax = (SP - PL_stack_base) + 1;

เบ–เป‰เบฒ (เบ™เบฑเบš != 2)
croak("เบšเบฑเบ™เบซเบฒเปƒเบซเบเปˆ\n");

printf("%d + %d = %d\n", a, b, SvIV(ST(0));
printf("%d - %d = %d\n", a, b, SvIV(ST(1));

PUTBACK;
FREETMPS;
เบญเบญเบเบˆเบฒเบ;
}

เบญเปˆเบทเบ™

1. เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบงเปˆเบฒเบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบเปเบฒเบ™เบปเบ”เบ•เบปเบงเปเบ› "เบ‚เบงเบฒเบ™". เบ™เบตเป‰เปเบกเปˆเบ™เบเป‰เบญเบ™เบงเปˆเบฒ "ST"
เบกเบฐเบซเบฒเบžเบฒเบเบ„เบฒเบ”เบงเปˆเบฒเบกเบฑเบ™เบกเบตเบขเบนเปˆ. เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบขเบนเปˆเปƒเบ™ XSUB เบกเบฑเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบตเปˆเบˆเบฐเบเปเบฒเบ™เบปเบ”
"เบ‚เบงเบฒเบ™" เบเป‰เบญเบ™เบงเปˆเบฒเบกเบฑเบ™เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เปเบฅเป‰เบงเบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒ.

2. เบฅเบฐเบซเบฑเบ”

SPAGAIN;
SP -= เบ™เบฑเบš;
ax = (SP - PL_stack_base) + 1;

เบ•เบฑเป‰เบ‡ stack เบ‚เบถเป‰เบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰ "ST" macro.

3. เบšเปเปˆเป€เบซเบกเบทเบญเบ™เบเบฑเบšเบฅเบฐเบซเบฑเบ”เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบ‚เบญเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰, เบ„เปˆเบฒเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบšเปเปˆเป„เบ”เป‰เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡
เบ„เปเบฒเบชเบฑเปˆเบ‡เบ›เบตเป‰เบ™เบเบฑเบšเบเบฑเบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ ST(0) เบซเบกเบฒเบเป€เบ–เบดเบ‡เบ„เปˆเบฒเบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เป‚เบ”เบ Perl subroutine
เปเบฅเบฐ "ST(count-1)" เบซเบกเบฒเบเป€เบ–เบดเบ‡เบญเบฑเบ™เบชเบธเบ”เบ—เป‰เบฒเบ.

เบเบฒเบ™เบชเป‰เบฒเบ‡ เปเบฅเบฐ เบเบฒเบ™เป‚เบ— an Anonymous เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบเปˆเบญเบ in C
เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบชเบฐเปเบ”เบ‡เปเบฅเป‰เบง, "call_sv" เบชเบฒเบกเบฒเบ”เบ–เบทเบเปƒเบŠเป‰เป€เบžเบทเปˆเบญเป€เบญเบตเป‰เบ™เบเบดเบ”เบˆเบฐเบงเบฑเบ”เบเปˆเบญเบเบ—เบตเปˆเบšเปเปˆเป€เบ›เบตเบ”เป€เบœเบตเบเบŠเบทเปˆ. เปเบ™เบงเปƒเบ”เบเปเปˆเบ•เบฒเบก,
เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบชเบฐเบ„เบดเบš Perl เบ—เบตเปˆเป€เบญเบตเป‰เบ™ XSUB เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ™เบตเป‰. เปƒเบซเป‰เป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡
เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เปเบ™เบงเปƒเบ”เบžเบฒเบเปƒเบ™เบฅเบฐเบซเบฑเบ” C เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

...

SV *cvrv = eval_pv("sub { เบžเบดเบก 'เบ—เปˆเบฒเบ™เบˆเบฐเบšเปเปˆเบžเบปเบšเบ‚เป‰เบญเบ cluttering namespace เปƒเบ”!' }", TRUE);

...

call_sv(cvrv, G_VOID|G_NOARGS);

"eval_pv" เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบฅเบงเบšเบฅเบงเบกเบเบฒเบ™เบเปˆเบญเบเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบฅเบฐเบšเบธเบŠเบทเปˆ, เป€เบŠเบดเปˆเบ‡เบˆเบฐเป€เบ›เบฑเบ™เบ„เปˆเบฒเบเบฑเบšเบ„เบทเบ™.
เบ”เบต (เบญเปˆเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบš "eval_pv" เปƒเบ™ "eval_pv" เปƒเบ™ perlapi). เป€เบกเบทเปˆเบญเบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เบขเบนเปˆเปƒเบ™
เบกเบท, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฐเบชเบปเบกเบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™.

เปเบชเบ‡เบชเบฐเบซเบงเปˆเบฒเบ‡ เบเบฒเบ™เป‚เบ—เบเบฑเบš


เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เป€เบญเบตเป‰เบ™เบเบดเบ”เบˆเบฐเบงเบฑเบ”เบเปˆเบญเบเบ”เบฝเบงเบเบฑเบ™เบŠเป‰เบณเป†. เบ™เบตเป‰เบกเบฑเบเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เบเบฑเบš a
เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบ„เปˆเบฒ, เป€เบŠเบฑเปˆเบ™ Perl's built-in เบ„เบฑเบ” (). เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบœเปˆเบฒเบ™ a
เบŸเบฑเบ‡เบŠเบฑเบ™เบ›เบฝเบšเบ—เบฝเบšเบเบฑเบš เบ„เบฑเบ” (), เป€เบŠเบดเปˆเบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบˆเบฐเบ–เบทเบเป€เบญเบตเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบ—เบธเบเป†เบ„เบนเปˆเบ‚เบญเบ‡เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆ
เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ›เบฝเบšเบ—เบฝเบš. เป„เบ”เป‰ เบ—เบณเบญเบดเบ”() เปเบฅเบฐ เบซเบผเบธเบ”() เบŸเบฑเบ‡เบŠเบฑเบ™เบˆเบฒเบเบฅเบฒเบเบเบฒเบ™::Util เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™
เบฎเบนเบšเปเบšเบš.

เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ™เบตเป‰โ€‹เบกเบฑเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เป„เบ›โ€‹เป„เบ”เป‰โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เป€เบฅเบฑเปˆเบ‡โ€‹เบเบฒเบ™โ€‹เบ›เบปเบโ€‹เบเบฐโ€‹เบ•เบด (เบกเบฑเบโ€‹เบˆเบฐโ€‹เบ‚เป‰เบญเบ™โ€‹เบ‚เป‰เบฒเบ‡โ€‹เบซเบผเบฒเบโ€‹) เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹
API callback เบ™เป‰เบณเปœเบฑเบเป€เบšเบปเบฒ. เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เปเบกเปˆเบ™เบงเปˆเบฒเบชเบฐเบžเบฒเบšเบเบฒเบ™เป‚เบ—เบซเบฒเบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™
เบชเป‰เบฒเบ‡เปเบฅเบฐเบ—เปเบฒเบฅเบฒเบเบ„เบฑเป‰เบ‡เบ”เบฝเบง, เปเบฅเบฐเบเปˆเบญเบเบชเบฒเบกเบฒเบ”เป€เบญเบตเป‰เบ™เบงเปˆเบฒ arbitrarily เบซเบผเบฒเบเบ„เบฑเป‰เบ‡เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡.

เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เบ›เบปเบเบเบฐเบ•เบดเบ—เบตเปˆเบˆเบฐเบœเปˆเบฒเบ™เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเปเบ›เบ—เบปเปˆเบงเป‚เบฅเบ (เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบด $_ เบชเปเบฒเบฅเบฑเบšเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ”เบฝเบง, เบซเบผเบท
$a เปเบฅเบฐ $b เบชเปเบฒเบฅเบฑเบšเบชเบญเบ‡เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต) เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบœเปˆเบฒเบ™ @_. (เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบเบปเบ™เป„เบ @_
เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบฎเบนเป‰เบงเปˆเบฒเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เป€เบฎเบฑเบ”เบซเบเบฑเบ‡, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเปเปˆเบกเบต API เบ—เบตเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเปเบฒเบฅเบฑเบšเบกเบฑเบ™. เบกเบฑเบ™เบเบฑเบ‡
เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบดเปเบกเปˆเบ™เบŠเป‰เบฒเบฅเบปเบ‡.)

เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบเบฒเบ™เป‚เบ—เบกเบฐเบซเบฒเบžเบฒเบเป€เบ›เบฑเบ™เปเบšเบšเบ™เบตเป‰:

dMULTICALL; /* เบ›เบฐเบเบฒเบ”เบ•เบปเบงเปเบ›เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™ */
I32 gimme = G_SCALAR; /* เบšเปเบฅเบดเบšเบปเบ”เบ‚เบญเบ‡เบเบฒเบ™เป‚เบ—: G_SCALAR,
* G_ARRAY, เบซเบผเบท G_VOID */

PUSH_MULTICALL(cv); /* เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบšเปเบฅเบดเบšเบปเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป‚เบ—เบซเบฒ cv,
เปเบฅเบฐเบเปเบฒเบ™เบปเบ” vars เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก */

/* เบงเบปเบ‡ */ {
/* เบเปเบฒเบ™เบปเบ”เบ„เปˆเบฒเบ‚เบญเบ‡เบ•เบปเบงเปเบ›เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ‚เบญเบ‡เบ—เปˆเบฒเบ™ */
MULTICALL; /* เป‚เบ—โ€‹เบญเบญเบโ€‹เบ•เบปเบงโ€‹เบˆเบดเบ‡ */
} /* เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡ loop */

POP_MULTICALL; /* เบ—เบณเบฅเบฒเบเบšเปเบฅเบดเบšเบปเบ”เบเบฒเบ™เป€เบญเบตเป‰เบ™ */

เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹เบชเบตโ€‹เบกเบฑเบ‡โ€‹เบšเบฒเบ‡โ€‹, เป€เบšเบดเปˆเบ‡โ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบ‚เบญเบ‡โ€‹ เบ—เบณเบญเบดเบ”() เปเบฅเบฐ เบซเบผเบธเบ”() เบซเบ™เป‰เบฒเบ—เบตเปˆ
เบ‚เบญเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ::Util 1.18. เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบˆเบฐเบžเบปเบšเป€เบซเบฑเบ™เป„เบŸเบฅเปŒ header เบ—เบตเปˆเป€เบฎเบฑเบ”เบ•เบฒเบก multicall API
เปƒเบ™เบชเบฐเบšเบฑเบšเป€เบเบปเปˆเบฒเบ‚เบญเบ‡ perl.

เปƒเบŠเป‰ perlcall เบญเบญเบ™เป„เบฅเบ™เปŒเป‚เบ”เบเปƒเบŠเป‰เบšเปเบฅเบดเบเบฒเบ™ onworks.net


เป€เบŠเบตเบšเป€เบงเบต เปเบฅเบฐเบชเบฐเบ–เบฒเบ™เบตเป€เบฎเบฑเบ”เบงเบฝเบเบŸเบฃเบต

เบ”เบฒเบงเป‚เบซเบผเบ”เปเบญเบฑเบš Windows เปเบฅเบฐ Linux

  • 1
    unitedrpms
    unitedrpms
    เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบเบฑเบšเบžเบงเบเป€เบฎเบปเบฒเปƒเบ™ Gitter!
    https://gitter.im/unitedrpms-people/Lobby
    เป€เบ›เบตเบ”เปƒเบŠเป‰ URPMS repository เปƒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™
    เบฅเบฐเบšเบปเบš -
    https://github.com/UnitedRPMs/unitedrpms.github.io/bl...
    เบ”เบฒเบงเป‚เบซเบฅเบ” unitedrpms
  • 2
    เป€เบžเบตเปˆเบกเบซเป‰เบญเบ‡เบชเบฐCเบธเบ” C ++
    เป€เบžเบตเปˆเบกเบซเป‰เบญเบ‡เบชเบฐCเบธเบ” C ++
    Boost เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™ Portable เบŸเบฃเบต
    เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ” C++ เบ—เบตเปˆเป„เบ”เป‰เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เป‚เบ”เบเปเบนเปˆ. เป„เบ”เป‰
    เป€เบ™เบฑเป‰เบ™เปœเบฑเบเปƒเบชเปˆเบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เปเบšเบšเป€เบ„เบทเปˆเบญเบ™เบ—เบตเปˆ
    เป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เบ”เบตเบเบฑเบšเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™ C ++.
    เป€เบšเบดเปˆเบ‡ http://www.bo...
    เบ”เบฒเบงเป‚เบซเบฅเบ” Boost C++ Libraries
  • 3
    VirtualGL
    VirtualGL
    VirtualGL เบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡ 3D เบˆเบฒเบ a
    เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ Unix/Linux OpenGL เปƒเบชเปˆ a
    GPU เบ‚เป‰เบฒเบ‡เป€เบŠเบตเบšเป€เบงเบตเปเบฅเบฐเปเบ›เบ‡
    rendered เบฎเบนเบš 3D เป€เบ‚เบปเป‰เบฒโ€‹เป„เบ›โ€‹เปƒเบ™โ€‹เบชเบฐโ€‹เบ•โ€‹เบฃเบตเบกโ€‹เบงเบดโ€‹เบ”เบตโ€‹เป‚เบญโ€‹
    เบ—เบตเปˆ...
    เบ”เบฒเบงเป‚เบซเบฅเบ” VirtualGL
  • 4
    libusb
    libusb
    เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เป€เบžเบทเปˆเบญเป€เบ›เบตเบ”เปƒเบŠเป‰เบžเบทเป‰เบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰
    เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เป€เบžเบทเปˆเบญโ€‹เบ•เบดเบ”โ€‹เบ•เปเปˆโ€‹เบžเบปเบงโ€‹เบžเบฑเบ™โ€‹เบเบฑเบšโ€‹
    เบญเบธเบ›เบฐเบเบญเบ™ USB. เบœเบนเป‰เบŠเบปเบก: เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ, เบชเบดเป‰เบ™เบชเบธเบ”
    เบœเบนเป‰เปƒเบŠเป‰/เป€เบ”เบฑเบชเบ—เบฑเบญเบš. เบžเบฒเบชเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฃเปเบเบฃเบก: C.
    เปเบงเบ”เปเบนเปˆ...
    เบ”เบฒเบงเป‚เบซเบฅเบ” libusb
  • 5
    SWIG
    SWIG
    SWIG เป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบžเบฑเบ”เบ—เบฐเบ™เบฒเบŠเบญเบšเปเบง
    เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบšเบฑเบ™เบ”เบฒเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบ‚เบฝเบ™เปƒเบ™ C เปเบฅเบฐ
    C ++ เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบซเบฅเบฒเบเบซเบฅเบฒเบเบ‚เบญเบ‡เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡
    เบžเบฒเบชเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบก. SWIG เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบเบฑเบš
    เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™ ...
    เบ”เบฒเบงเป‚เบซเบฅเบ” SWIG
  • 6
    WooCommerce Nextjs React Theme
    WooCommerce Nextjs React Theme
    React WooCommerce เบซเบปเบงเบ‚เปเป‰, เบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบ”เป‰เบงเบ
    JS เบ•เปเปˆเป„เบ›, Webpack, Babel, Node, เปเบฅเบฐ
    เบ”เปˆเบงเบ™, เปƒเบŠเป‰ GraphQL เปเบฅเบฐ Apollo
    เบฅเบนเบโ€‹เบ„เป‰เบฒ. เบฎเป‰เบฒเบ™ WooCommerce เปƒเบ™ React(
    เบ›เบฐโ€‹เบเบญเบšโ€‹เบ”เป‰เบงเบโ€‹: เบœเบฐโ€‹เบฅเบดเบ”โ€‹เบ•เบฐโ€‹เบžเบฑเบ™ ...
    เบ”เบฒเบงเป‚เบซเบฅเบ” WooCommerce Nextjs React Theme
  • เป€เบžเบตเปˆเบกเป€เบ•เบตเบก ยป

Linux เบ„เบณ เบชเบฑเปˆเบ‡

  • 1
    ac++
    ac++
    เปƒเบŠเป‰ ac++ เบญเบญเบ™เบฅเบฒเบเป‚เบ”เบเปƒเบŠเป‰ onworks.net
    เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™. ...
    เปเบฅเปˆเบ™ ac++
  • 2
    เบญเบฒเบเบฒเบ•
    เบญเบฒเบเบฒเบ•
    atool - script เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เป„เบŸเบฅเปŒ
    เบฎเบงเบšเบฎเบงเบกเบ‚เบญเบ‡เบ›เบฐเป€เบžเบ”เบ•เปˆเบฒเบ‡เป† ...
    เปเบฅเปˆเบ™ acat
  • 3
    cpants_lintp
    cpants_lintp
    cpants_lint - commandline frontend เบเบฑเบš
    เป‚เบกเบ”เบนเบ™::CPANTS::เบงเบดเป€เบ„เบฒเบฐ...
    เปเบฅเปˆเบ™ cpants_lintp
  • 4
    cpbm
    cpbm
    cpbm - เบŠเบธเบ”เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบŠเบญเบšเปเบง
    (เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš: CPROVER benchmarking
    เบเบญเบš)...
    เปเบฅเปˆเบ™ cpbm
  • 5
    เปเบเบกเบˆเบต
    เปเบเบกเบˆเบต
    gamgi - เบเบฒเบ™เบชเป‰เบฒเบ‡เปเบšเบšเบˆเปเบฒเบฅเบญเบ‡เบ›เบฐเบฅเปเบฒเบกเบฐเบ™เบนเบ—เบปเปˆเบงเป„เบ›
    เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบฎเบนเบšเบžเบฒเบš ...
    เปเบฅเปˆเบ™ gamgi
  • 6
    gamgi.real
    gamgi.real
    gamgi - เบเบฒเบ™เบชเป‰เบฒเบ‡เปเบšเบšเบˆเปเบฒเบฅเบญเบ‡เบ›เบฐเบฅเปเบฒเบกเบฐเบ™เบนเบ—เบปเปˆเบงเป„เบ›
    เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบฎเบนเบšเบžเบฒเบš ...
    เปเบฅเปˆเบ™ gamgi.real
  • เป€เบžเบตเปˆเบกเป€เบ•เบตเบก ยป

Ad