рдпрджрд┐ рдЖрдкрдиреЗ рдХрднреА рдЕрдкрдиреЗ рдмреЙрдЯ, рдПрдХ рд╡рд╛рд░реНрддрд╛рдХрд╛рд░, рд╕рдВрдЪрд╛рд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛, рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдкрд░рд┐рдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрдиреЛрдВ рдХреЗ рдкрд╛рд░ рдЖрдПред рдпрд╣ рд╡рд┐рд╖рдп, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЕрдЪрд╛рдирдХ рдЖрдкрдХреЗ рдкрд╛рд╕ "рдСрдЯреЛрдореЗрдЯрд╛ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд" рдореЗрдВ рдПрдХ рдХреЛрд░реНрд╕ рдирд╣реАрдВ рдерд╛, рддреЛ рдЖрдкрдХреЛ рдмрд┐рд▓реНрд▓реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рдЖрдЬ рд╣рдо рдПрдХ рд╕рд░рд▓ рдирд┐рд░реНрдзрд╛рд░рдХ рдкрд░рд┐рдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрди рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдЕрдЪрд╛рдирдХ рдЗрд╕реЗ рдкрд░реНрд▓ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдкрд░рд┐рдЪрдп
рд╣рдо рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдПрдВрдЧреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╕рд╛рд╣рд┐рддреНрдп, Google рдФрд░ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛;) рд╣реИрдВред рдЖрдзрд╛рд░ рдкрд░ рд╣реА рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреНрдпрд╛ рд╣реИред
рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХреНрд╕ рдореЗрдВ, рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ, рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рддрдерд╛рдХрдерд┐рдд "рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди" рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдЕрдкрдиреА рд╕реНрдореГрддрд┐ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрджрд┐рдо рдЕрдореВрд░реНрдд рд╣реИ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рд╣реИ, рдЗрд╕рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдореВрд▓реНрдп рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рдорд╛рди рд╣рдореЗрд╢рд╛ рдХреЗрд╡рд▓ рдЗрдирдкреБрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдФрд░ рдЕрдЧрд░ рд╣рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдЧрд▓реЗ рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдХреБрдЫ рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рд╕реЗ? рдпрд╣рд╛рдБ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреА рд╕реНрдореГрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдореВрд░реНрдд рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдпрд╣ рдорд╢реАрди рд╣реЛрдЧреАред рдорд╢реАрди рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рдореВрд▓реНрдп рдЗрдирдкреБрдЯ рдореВрд▓реНрдп рдФрд░ рдорд╢реАрди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЛ рддрджрдиреБрд╕рд╛рд░ рдЗрд╕рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕рдХреЗ рдЖрдВрддрд░рд┐рдХ рд░рд╛рдЬреНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░рд┐рдорд┐рдд рд╣реИред рдФрд░, рд╢рд╛рдпрдж, рд░рд╛рдЬреНрдп рдорд╢реАрдиреЛрдВ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдирд┐рд░реНрдзрд╛рд░рдХ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд░рд╛рдЬреНрдп рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдорд╢реАрди рд╡рд░реНрддрдорд╛рди рд╕реЗ рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реА рдорд╢реАрди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ:
- рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐;
- рдЗрдирдкреБрдЯ рд╡рд░реНрдгрдорд╛рд▓рд╛ (рд╕рдВрднрд╛рд╡рд┐рдд рдЗрдирдкреБрдЯ рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ);
- рдХрдИ рд╢рд░реНрддреЗрдВ;
- рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рддрд╛рд▓рд┐рдХрд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╢реАрди рдХрд╛ рдкреВрд░рд╛ рд╕рд╛рд░ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдЧреНрд░рд╛рдл рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрдХреНрд░рдордг рддрд╛рд▓рд┐рдХрд╛ (рдПрдХ рд╕рдВрдХреНрд░рдордг рдЖрд░реЗрдЦ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдореЗрдВ 3 рдХреЙрд▓рдо рд╣реЛрддреЗ рд╣реИрдВ: рдЗрдирдкреБрдЯ рд╕рдВрдХреЗрдд (рдкреНрд░рддреАрдХ), рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐, рдЕрдЧрд▓реА рд╕реНрдерд┐рддрд┐ред рд╕рдм рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдЖрдзрд╛рд░ рд╡рд░реНрдЧ
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рддрдп рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛, рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдФрд░ рд╕рдВрдХреНрд░рдордг рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрдирдкреБрдЯ рд╡рд░реНрдгреЛрдВ рдХреА рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХрд╛рд░реНрдп рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрдирдкреБрдЯ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп (рд╕рд░рд▓) рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрддреНрдкрд╛рджрди рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╡рдВрд╢рдЬ рд╡рд░реНрдЧ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рддрд░реАрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреГрддреНрд░рд┐рдо рд░реВрдк рд╕реЗ "*" рдХреЛ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВ - рдХреЛрдИ рдЕрдиреНрдп рдкреНрд░рддреАрдХред
package FSM; use strict; use Carp; use vars qw($AUTOLOAD);
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЗ рдирд╛рдо рдЕрдкрдиреЗ рд▓рд┐рдП рдмреЛрд▓рддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдпрд╣
рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдФрд░
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдкрд╣рд▓рд╛ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╣реИрд╢ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ SYMBOL рдлрд╝реАрд▓реНрдб рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЗрдирдкреБрдЯ рдкреНрд░рддреАрдХ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдСрдЯреЛрдореЗрдЯрди рдХреА рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред рдФрд░
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА "рдХреНрд▓реЙрдХрд┐рдВрдЧ", рдЕрдЧрд▓реЗ рд╕рд┐рдЧреНрдирд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреА рд╣реИред
рд╣рдо рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХрдХреНрд╖рд╛ рдХрд╛ рджрд┐рд▓ рд╕реНрдЯреЗрдЯреНрд╕ рд╢рд╛рдЦрд╛ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╣реИрд╢ рдХрд╛ рд╣реИрд╢ рд╣реИрд╢ :)ред рдпрд╣рд╛рдВ рд╡рд┐рдЪрд╛рд░ рд╕рд░рд▓ рд╣реИ, рдкрд╣рд▓реЗ рд╕реНрддрд░ рдкрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд░рд╛рдЬреНрдпреЛрдВ (STATE) рдФрд░ рдЙрдирд╕реЗ рдЬреБрдбрд╝реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред рдЪреВрдВрдХрд┐ рд╕рдВрдХреНрд░рдордг рдХреЗрд╡рд▓ рдЗрдирдкреБрдЯ рдкреНрд░рддреАрдХ (SYMBOL) рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрджрдиреБрд╕рд╛рд░, рдпреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдРрд╕реЗ рд╕рдВрдХреЗрдд рд╣реЛрдВрдЧреЗ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИрдВред рдЦреИрд░, рд╕рдВрдХреЗрдд рд╕реЗ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЧрд▓реЗ рд░рд╛рдЬреНрдп (NEXT) рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░, рдЙрдкрд╛рдВрдЧ рдореЗрдВ, рдХреНрд░рд┐рдпрд╛ (рдХрд╛рд░реНрд░рд╡рд╛рдИ), рдЬреЛ рдХрд┐ рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИред
рдпрд╛рдиреА
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ, рд╣рдо рдкрд╣рд▓реЗ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ (
рд╕рд╛рдорд╛рдиреНрдпрдХреГрдд ) рд╕реЗ рдЗрдирдкреБрдЯ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреЗ рдЪрд░рд┐рддреНрд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд░рд╛рдЬреНрдпреЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдиреЗ рд╡рд╛рд▓рд╛ рдЪрд░рд┐рддреНрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред рдпрджрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ "*" рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣ рдЧрдпрд╛ рд╣реИ - рдХреЛрдИ рдЕрдиреНрдп рдкреНрд░рддреАрдХред рдЕрдЧрд▓рд╛, рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд░рд╛рдЬреНрдп-рд╕рд┐рдЧреНрдирд▓ рдЬреЛрдбрд╝реА рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЧрдИ рд╣реИред рдпрджрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдФрд░ рдЕрдЧрд▓реЗ рд░рд╛рдЬреНрдп рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝реЗрдВ, рдЕрдЧрд░ рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ (CURRENT рдЪрд░ рдХреЛ рдмрджрд▓реЗрдВ)ред рдпрджрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╣рдорд╛рд░реА рдорд╢реАрди рдХреЗ рд▓рд┐рдП рдПрдХ рдШрд╛рддрдХ рддреНрд░реБрдЯрд┐ рд╣реИред
рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдо рдорд╢реАрди рдХреЛ STDERR рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдбрд┐рдмрдЧ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧ рдореЗрдВ рдЗрд╕ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг
рдЖрдЗрдП рдХреБрдЫ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдЪреИрдЯрдмреЙрдЯ рд╣реЛрдиреЗ рджреЗрдВред
рд╣рдо рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
- рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЕрдкрдирд╛ рдкрд░рд┐рдЪрдп рджреЗрдирд╛ рд╣реЛрдЧрд╛ ( рд▓реЙрдЧрд┐рди )
- рдореЗрдореЛрд░рд╛рдЗрдЬрд╝ рдХрдорд╛рдВрдб рдкрд░, рд╣рдо рд╡рд╣ рд╕рдм рдХреБрдЫ рдпрд╛рдж рд░рдЦреЗрдВрдЧреЗ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ, рдирд┐рдХрд╛рд╕ рдХрдорд╛рдВрдб рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ
- рдХрдорд╛рдВрдб рдПрди рдкрд░, рдпрд╛рдж рдХрд┐рдП рдЧрдП рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╕рдВрдЦреНрдпрд╛ рдПрди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ
- рд╕рддреНрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдЖрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рддреЛ, рдЖрдЗрдП рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд╛рдВрддрд░рдг рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдБ:
рдкреНрд░рддреАрдХ | рд░рд╛рдЬреНрдп | рдЕрдЧрд▓реА рдЕрд╡рд╕реНрдерд╛ | рдкреНрд░рднрд╛рд╡ |
---|
рд▓реЙрдЧрд┐рди | INIT | рд╕рддреНрд░ | рдЦреБрд▓рд╛ рд╕рддреНрд░ |
* | INIT | INIT | - |
* | рд╕рддреНрд░ | рд╕рддреНрд░ | - |
рдХрд╣реЛ | рд╕рддреНрд░ | рд╕рддреНрд░ | рд╣рдо рд▓рд╛рдЗрди рдирдВрдмрд░ рдПрди рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ |
рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ | рд╕рддреНрд░ | INIT | - |
рдпрд╛рдж рдХрд░рдирд╛ | рд╕рддреНрд░ | рд╕реНрдЯреЛрд░ | - |
* | рд╕реНрдЯреЛрд░ | рд╕реНрдЯреЛрд░ | рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдмрдлрд╝рд░ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ |
рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ | рд╕реНрдЯреЛрд░ | рд╕рддреНрд░ | - |
рдХреБрд▓ рдореЗрдВ, рдорд╢реАрди рдХреА рд╡рд░реНрдгрдорд╛рд▓рд╛ рдореЗрдВ рд╡рд░реНрдг (LOGIN, MEMORIZE, SAY, EXIT, *) рд╣реЛрддреЗ рд╣реИрдВ, рдорд╢реАрди рдореЗрдВ 3 рд░рд╛рдЬреНрдп рд╣реЛрддреЗ рд╣реИрдВ (INIT, SESSION рдФрд░ STORE)ред
рдЕрдЪреНрдЫрд╛, рдЪрд▓реЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЬрдВрдк рдЯреЗрдмрд▓ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ - рддрдерд╛рдХрдерд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗрдВред рдХреЛрдИ рдХрдард┐рдирд╛рдИ рдирд╣реАрдВ :)
package ChatBot; use FSM; @ISA = ("FSM"); use strict; use Carp; use vars qw($AUTOLOAD); sub new { my $proto = shift; my $class = ref($proto) || $proto; my $self = $class->SUPER::new("INIT"); $self->addState(STATE => "INIT", SYMBOL => "*", NEXT => "INIT", ACTION => \&doIntroduce); $self->addState(STATE => "INIT", SYMBOL => "LOGIN", NEXT => "SESSION", ACTION => \&doLogin); $self->addState(STATE => "INIT", SYMBOL => "EXIT", NEXT => "INIT", ACTION => \&doQuit); $self->addState(STATE => "SESSION", SYMBOL => "*", NEXT => "SESSION"); $self->addState(STATE => "SESSION", SYMBOL => "EXIT", NEXT => "INIT"); $self->addState(STATE => "SESSION", SYMBOL => "SAY", NEXT => "SESSION", ACTION => \&doSay); $self->addState(STATE => "SESSION", SYMBOL => "MEMORIZE",NEXT => "STORE"); $self->addState(STATE => "STORE", SYMBOL => "*", NEXT => "STORE", ACTION => \&doRemember); $self->addState(STATE => "STORE", SYMBOL => "EXIT", NEXT => "SESSION"); $self->{SESSION} = {}; $self->{LOGIN} = ""; return $self; } sub normalize { my ($self, $symbol) = @_; my $ret = {}; if ($symbol =~ /^(\S+)(.*)$/) { $ret->{SYMBOL} = uc $1; $ret->{DATA} = $2; $ret->{RAW} = $symbol; } else { $ret->{SYMBOL} = "*"; $ret->{DATA} = $symbol; $ret->{RAW} = $symbol; } return $ret; } sub doIntroduce { my $self = shift; print "Please introduce yourself first!\n"; return $self; } sub doLogin { my ($self, $symbol) = @_; print "Welcome," . $symbol->{DATA} . "\n"; $self->{LOGIN} = $symbol->{DATA}; $self->{SESSION}->{$self->{LOGIN}} = () unless exists $self->{SESSION}->{$self->{LOGIN}}; return $self; } sub doSay { my ($self, $symbol) = @_; if (defined $self->{SESSION}->{$self->{LOGIN}}->[$symbol->{DATA}]) { print $self->{SESSION}->{$self->{LOGIN}}->[$symbol->{DATA}]; } else { print "No record\n"; } return $self; } sub doRemember { my ($self, $symbol) = @_; push @{ $self->{SESSION}->{$self->{LOGIN}} }, $symbol->{RAW}; return $self; } sub doQuit { my ($self, $symbol) = @_; print "Bye bye!\n"; exit; return $self; } 1;
рд╕рдВрдХреНрд░рдордг рдЖрд░реЗрдЦ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рддрд╛рд▓рд┐рдХрд╛ рдирд┐рдореНрди рд░реВрдк рдореЗрдВ рд╣реЛрдЧреА:
{ 'INIT' => { '*' => { 'ACTION' => \&doIntroduce, 'NEXT' => 'INIT' }, 'LOGIN' => { 'ACTION' => \&doLogin, 'NEXT' => 'SESSION' }, 'EXIT' => { 'ACTION' => \&doQuit, 'NEXT' => 'INIT' } }, 'STORE' => { '*' => { 'ACTION' => \&doRemember, 'NEXT' => 'STORE' }, 'EXIT' => { 'NEXT' => 'SESSION' } }, 'SESSION' => { 'SAY' => { 'ACTION' => \&doSay, 'NEXT' => 'SESSION' }, '*' => { 'NEXT' => 'SESSION' }, 'MEMORIZE' => { 'NEXT' => 'STORE' }, 'EXIT' => { 'NEXT' => 'INIT' } } }
рдЖрдЗрдП рдЗрди рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦреЗрдВред
use ChatBot; $bot = ChatBot->new(); while(<>) { $bot->process($_); }
рдЦреИрд░, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬрд╛рдБрдЪред рдЗрдирдкреБрдЯ рдкрд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рджреЗрддреЗ рд╣реИрдВред
hello world! login %username% hello world! say 3 memorize hey, do you really remember everything i would say? let's check exit say 0 exit hello login %username% say 1 exit
рд╣рдореЗрдВ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рдХреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ?
Please introduce yourself first! Welcome, %username% No record hey, do you really remember everything i would say? Please introduce yourself first! Welcome, %username% let's check
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЖрдЬрд╝рдорд╛рдПрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкрд░рд┐рдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдпрд╣ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ? рдпрд╣ рдХрд╣рд╛рдВ рдХрд╛рдо рдЖ рд╕рдХрддрд╛ рд╣реИ? рдЦреИрд░, рдЪреИрдЯ рдмреЙрдЯ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЙрд╕реА рдЪреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЧрд░ рджреВрд╕рд░реА рддрд░рдл рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд▓реЛрд╣реЗ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ - рдЖрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдХреЗ рдФрд░ рдЬрд╡рд╛рдм рд╕реБрдирдХрд░ рд╣рдо рдПрдХ рдмреЙрдЯ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд╛рдЙрдЯрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдШреБрдорд╛рдХрд░ред рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рдХрдорд╛рдВрдб рдЗрдВрдЯрд░рдлреЗрд╕? рд╣рд╛рдВ, рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдм рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ! рдПрдХ рд╕реНрдЯреЗрдЯрдлреБрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рд╕реЗрд╡рд╛ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдХреБрдЫ рднреА рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ!
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдЙрдкрдпреЛрдЧреА рдерд╛ред рд╣рд╛рдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрджрд┐рдо рд╣реИ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рддреИрдпрд╛рд░-рддреИрдпрд╛рд░ рд▓реЛрдЧ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЦрд░реЛрдВрдЪ рд╕реЗ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдирд╣реАрдВ рд╣реИ?
рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред