เบเบตเปเปเบกเปเบเบเปเบฒเบชเบฑเปเบ 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