pokespawn是什么意思?
/pokespawn (神奇宝贝名称) [参数] [参数] - 这是召唤出神奇宝贝。
/pokegive (玩家) (神奇宝贝名称) [参数] [参数] - 某玩家直接获得一只神奇宝贝。
/pokeheal (玩家) - 治疗某玩家的所有神奇宝贝。
/pokebattle (玩家1) (玩家2) - 让两个玩家进行战斗。
/pokebattle2 (玩家) [玩家]/[神奇宝贝名称] [玩家]/[神奇宝贝名称] [玩家]/[神奇宝贝名称] - 让多个玩家进行战斗,但是是一起战斗。
/pokestats (玩家) - 查看某玩家的对战记录。
/resetpokestats (玩家) - 清除某玩家的战斗纪录。
/freeze - 让整个世界的神奇宝贝都不动。(但还可战斗)
/struc - 建造神奇宝贝中心。(不可重迭,要相隔很远才能放)
/getbiomedata - 不知道干什么的
/ tpbat 不知道干什么的
精灵名字(注:有些精灵可能召唤不了)
001 妙蛙种子 Bulbasaur - Bulb(植物的球茎) + Saurian(蜥蜴)
002 妙蛙草 Ivysaur - Ivy(常春藤) + Saurian(蜥蜴)
003 妙蛙草花 Venusaur - Venus(维纳斯) + Saurian(蜥蜴)
004 小火龙 Charmander - Char(烧焦) + Salamander(火蜥蜴)
005 火恐龙 Charmeleon - Char(烧焦) + Chameleon(变色龙)
006 喷火龙 Charizard - Char(烧焦) + Lizard(蜥蜴)
007 杰尼龟 Squirtle - Squirt(喷射) + Turtle(海龟)
008 卡咪龟 Wartortle - War(战斗) + Turtle(海龟)
009 水箭龟 Blastoise - Blast(疾风) + Tortoise(龟)
010 绿毛虫 Caterpie - Caterpillar(毛虫)
011 铁甲蛹 Metapod - Metamorphism(变形) + Pod(豆荚)
012 巴大蝴 Butterfree - Butterfly(蝴蝶) + Free(自由)
013 独角虫 Weedle - Worm(蠕虫) + Needle(针)
014 铁壳虫 Kakuna - Cocoon(茧)
015 大针蜂 Beedrill - Bee(蜜蜂) + Drill(钻)
016 波波 Pidgey - Pigeon(鸽子)
017 比比鸟 Pidgeotto - Pigeon(鸽子)
018 比雕 Pidgeot - Pigeon(鸽子)
019 小拉达 Rattata - Rat(老鼠)-a-tat-tat
020 拉达 Raticate - Rat(老鼠) + Eradicate(根除)
021 烈雀 Spearow - Sparrow(麻雀) + Spear(矛,枪)
022 大嘴雀 Fearow - Fear(畏惧) + Sparrow(麻雀)
023 阿柏蛇 Ekans - Snake(蛇)(**Sanke从右往左为Eknas)
024 阿柏怪 Arbok - Cobra(眼镜蛇)(**Cobra从右往左为Arboc)
025 皮卡丘 Pikachu - Spark(火花,闪烁)(**日语) + Chu(**老鼠发出的声响)
026 雷丘 Raichu - Thunder(打雷)(**日语) + Chu(**老鼠发出的声响)
027 穿山鼠 Sandshrew - Sand(沙子) + Shrew(地鼠)
028 穿山王 Sandslash - Sand(沙子) + Slash(猛砍)
029 尼多兰 Nidoran (F) - (**尼多力诺的变化型)
030 尼多娜 Nidorina - (**参见尼多力诺)
031 尼多后 Nidoqueen - Nidorina(尼多娜) + Queen(女王)
032 尼多朗 Nidoran (M) - (**尼多力诺的变化型)
033 尼多力诺 Nidorino - Rhino(犀牛)
034 尼多王 Nidoking - Nidorino(尼多力诺) + King(国王)
035 皮皮 Clefairy - Clef(音部记号) + Fairy(仙女,精灵)
036 皮可西 Clefable - Clef(音部记号) + Fable(神话)
037 六尾 Vulpix - Vulpine(狐狸的) + Six(六)
038 九尾 Ninetales - Nine(九) + Tails(尾巴)
039 胖丁 Jigglypuff - Jiggly(摇晃的) + Puff(喷,膨胀)
040 胖可丁 Wigglytuff - Wiggly(左右摇摆的) + Tough(坚强的)
041 超音蝠 Zubat - Bat(蝙蝠)
042 大嘴蝠 Golbat - Gold(金的) + Bat(蝙蝠)
043 走路草 Oddish - Odd(单只的) + Radish(小萝卜)
044 臭臭花 Gloom - Gloom(阴沉,忧郁)
045 霸王花 Vileplume - Vile(卑鄙的,可耻的) + Plume (云)
046 派拉斯 Paras - (**参见派拉斯特)
047 派拉斯特 Parasect - Parasite(寄生植物) + Insect(昆虫)
048 毛球 Venonat - Venom(毒液) + Gnat(小昆虫)
049 末入蛾 Venomoth - Venom(毒液) + Moth(蛾)
050 地鼠 Diglett - Dig(挖洞) + -Let (小的东西)(**后缀)
051 三地鼠 Dugtrio - Dug(挖洞) + Trio(三个一组)
052 喵喵 Meowth - Meow(猫叫)
053 猫老大 Persian - Persian cat(波斯猫)
054 可达鸭 Psyduck - Psychic(精神的,超自然的) + Duck(鸭)
055 哥达鸭 Golduck - Gold(金的) + Duck(鸭)
111 铁甲犀牛 Rhyhorn - Rhino(犀牛) + Horn(角)
112 铁甲暴龙 Rhydon - Rhino(犀牛) + Don(**指物体)
113 吉利蛋 Chansey - Chancey(运气的)
114 蔓藤怪 Tangela - Tangle(缠结)
115 袋龙 Kangaskhan - Kangaroo(袋鼠) + Kahn(可汗)(**蒙古族对君主的称呼)
116 墨海马 Horsea - Horse(马) + Sea(海)
117 海刺龙 Seadra - Sea(海) + Dragon(龙)
118 角金鱼 Goldeen - Goldfish(金鱼) + Queen(女王)
119 金鱼王 Seaking - Sea(海) + King(国王)
120 海星星 Staryu - Star(星星) + You(你)
121 宝石海星 Starmie - Star(星星) + Me(我)
122 吸盘魔偶 Mr. Mime - Mister(先生) + Mime(模仿,滑稽哑剧)
123 飞天螳螂 Scyther - Scythe(长柄镰刀)
124 迷唇姐 Jynx - Jinx(不详物)
125 电击兽 Electabuzz - Electric(电的) + Buzz(嗡嗡声)
126 鸭嘴火龙 Magmar - Magma(岩浆)
127 大甲 Pinsir - Pincer(铁钳,钳子)
128 肯泰罗 Tauros - Taurus(金牛座)
129 鲤鱼王 Magikarp - Magic(魔力的) + Carp(鲤鱼)
130 暴鲤龙 Gyarados - Gyre(旋回)
131 乘龙 Lapras - (**即乘龙的日文名称ラプラス)
132 百变怪 Ditto - Ditto(相同)
133 伊布 Eevee - E.V.(进化)(**Evolution的缩写)
134 水精灵 Vaporeon - Vapor(水蒸气) + Eon(进化)(**Evolution)
135 雷精灵 Jolteon - Jolt(震摆) + Eon(进化)(**Evolution)
136 火精灵 Flareon - Flare(闪耀) + Eon(进化)(**Evolution)
137 3D龙 Porygon - Polygon(多边形)
138 菊石兽 Omanyte - Ammonite(菊石)
139 多刺菊石兽 Omastar - Ammonite(菊石) + Star(星)
140 化石盔 Kabuto - Kabuto(头盔)(**日语)
141 镰刀盔 Kabutops - Kabuto(头盔)(**日语)
142 化石翼龙 Aerodactyl - Aero(飞行的) + Pterodactyl(翼龙)
143 卡比兽 Snorlax - Snore(打鼾) + Relax(休息)
144 急冻鸟 Articuno - Artic(艺术品) + Uno(一)(**西班牙语)
145 闪电鸟 Zapdos - Zap(攻击) + Dos(二)(**西班牙语)
146 火焰鸟 Moltres - Molten(融化) + Tres(三)(**西班牙语)
147 迷你龙 Dratini - Dragon(龙) + Tiny(微小的)
148 哈克龙 Dragonair - Dragon(龙) + Air(空中)
149 快龙 Dragonite - Dragon(龙) + -Ite(成员,后代)(**后缀)
150 超梦 Mewtwo - Mew(喵)(**猫叫声) + Two(二)
151 梦幻 Mew - Mew(喵)(**猫叫声)
152 菊草叶 Chikorita - Chicory(菊苣)(**一种植物)
153 月桂叶 Bayleef - Bay Leaf(月桂树叶)
154 大菊花 Maganium - Mega(大) + Geranium(天竺葵)(**一种植物)
155 火球鼠 Cyndaquil - Cinder(熔渣) + Quill(刚毛)
156 火岩鼠 Quilava - Quill(刚毛) + Lava(熔岩)
157 火暴兽 Typhlosion - Typhoon(台风) + Explosion(爆发,爆炸)
158 小锯鳄 Totodile - Tot(小孩) + Crocodile(鳄鱼)
159 蓝鳄 Croconaw - Crocodile(鳄鱼) + Gnaw(咬,啃)
160 大力鳄 Feraligatr - Feral(凶猛的) + Alligator(短吻鳄)(**产于美洲的鳄鱼)
161 尾立 Sentret - Sentry(哨兵) + Ferret(雪貂)
162 大尾立 Furret - Fur(软毛) + Ferret(雪貂)
163 咕咕 HootHoot - Hoot(**猫头鹰的叫声)
164 猫头夜鹰 Noctowl - Nocturnal(夜的) + Owl(猫头鹰)
165 芭瓢虫 Ledyba - Ladybird/Ladybug(瓢虫) + Baby(婴孩)
166 安瓢虫 Ledian - Ladybird/Ladybug(瓢虫)
167 线球 Spinarak - Spinneret(吐丝器) + Arachnid(蛛形纲)
168 阿力多斯 Ariados - Ariadne(阿里阿德涅)(**[希腊]一个变成蜘蛛的人) + Osmosis(渗透)
169 叉字蝠 Crobat - Crow(啼叫) + Bat(蝙蝠)
170 灯笼鱼 Chinchou - (?Chinchou)(**中国一个以纸灯闻名的地方)
171 电灯怪 Lanturn - Lantern(灯笼)
172 皮丘 Pichu - Pikachu(皮卡丘)
173 皮宝宝 Cleffa - Clef(音部记号) + Fairy(仙女,精灵)
174 宝宝丁 Igglybuff - Jiggly(摇晃的) + Buff(软皮)
175 波克比 Togepi - (**日语)
176 波克基古 Togetic - Togepi(波克比) + Tick(滴答声)
177 天然雀 Natu - Natural(自然的)
178 天然鸟 Xatu - Exotic(奇异的)
179 咩力羊 Mareep - Mary(玛丽) + Sheep(绵羊)
180 绵绵 Flaafy - Fluffy(绒毛似的) + Baa(羊叫声)
181 电龙 Ampharos - Amp(安培) + Pharaoh(法老)
182 美丽花 Bellossom - Bell(铃) + Blossom(花)
183 玛利露 Marill - Marine(海的) + Rill(小溪)
184 玛利露丽 Azumarill - Azure(碧空) + Marine(海的) + Rill(小溪)
185 胡说树 Sudowoodo - Pseudo(冒充的) + Wood(树)
186 牛蛙君 Politoed - Polliwog(蝌蚪) + Toed(有趾的)
187 毽子草 Hoppip - Hop(跳跃) + Pip(种子)
188 毽子花 Skiploom - Skip(跳跃) + Bloom(花)
189 毽子棉 Jumpluff - Jump(跳跃) + Fluff(绒毛)
190 长尾怪手 Aipom - Ape(猿) + Palm(手掌)
191 向日种子 Sunkern - Sun(太阳) + Kernel(谷粒)
192 向日花怪 Sunflora - Sun(太阳) + Flora(植物)
193 阳阳玛 Yanma - (**日语Yanyanma)
194 乌波 Wooper - Whoop(叫喊)
195 沼王 Quagsire - Quagmire(沼泽) + Sire(陛下)
196 太阳精灵 Espeon - ESP(超感觉的知觉)(**Extrasensory Perception的缩写) + Eon(进化)(**Evolution)
197 月精灵 Umbreon - Umbra(阴影) + Eon(进化)(**Evolution)
198 黑暗鸦 Murkrow - Murky(黑暗的) + Crow(乌鸦)
199 河马王 Slowking - Slow(迟钝的) + King(国王)
200 梦妖 Misdreavus - Mischievous(有害的)
201 未知图腾 Unown - Unknown(未知的)
202 果然翁 Wobbuffet - Wobble(摇晃) + Buffet(打击)
203 麒麟其 Girafarig - Giraffe(长颈鹿)
204 榛果球 Pineco - Pine Cone(松果)
205 佛烈托斯 Forretress - Forest(森林) + Fortress(堡垒)
206 土龙弟弟 Dunsparce - Dun(微暗的) + Sparse(稀少的)
207 天蝎 Gligar - Glider(滑翔机)
208 大钢蛇 Steelix - Steel(钢铁) + Onix(大岩蛇)
209 布卢 Snubbull - Snub(斥责) + Bulldog(牛头犬)
210 布卢皇 Granbull - Grand(重要的) + Bulldog(牛头犬)
211 千针鱼 Qwilfish - Quill(刚毛) + Fish(鱼)
212 巨钳螳螂 Scizor - Scissors(剪刀)
213 壶壶 Shuckle - Shuck(壳)
214 赫拉克罗斯 Heracross - Heracles(大力英雄)(**希腊一位强壮的力士) + Cross(交叉)
215 狃拉 Sneasel - Sneaky(鬼祟的) + Weasel(鼬鼠)
216 熊宝宝 Teddiursa - Teddy Bear(玩具熊) + Ursa(熊,小熊星座)(**拉丁文)
217 圈圈熊 Ursaring - Ursa(熊,大熊星座)(**拉丁文) + Ring(环状物)
218 熔岩虫 Slugma - Slug(鼻涕虫) + Magma(岩浆)
219 熔岩蜗牛 Magcargo - Magma(岩浆) + Escargot(食用蜗牛)(**法语)
220 小山猪 Swinub - Swine(猪) + Nub(块)
221 长毛猪 Piloswine - Pilo(多毛的)(**拉丁文) + Swine(猪)
222 太阳珊瑚 Corsola - Coral(珊瑚)
223 铁炮鱼 Remoraid - Remora(
297 超力王 Hariteyama - Hariteyama(**日本相扑中的一个等级:张り手)
298 露力丽 Azurill - Azure(蔚蓝的) + Rill(小溪)
299 朝北鼻 Nosepass - Nose(鼻) + Compass(指南针)
300 向尾猫 Skitty - Skittish(易激动的) + Kitty(小猫)
301 优雅猫 Delcatty - Delicate(灵敏的) + Cat(猫) + Kitty(小猫)
302 勾魂眼 Sableye - Sable(黑貂的) + Eye(眼睛)
303 大嘴娃 Mawile - Maw(胃) + Wile(阴谋)
304 可可多拉 Aron - Armor(装甲) + Iron(铁)
305 可多拉 Lairon - Lair(巢穴) + Iron(铁)
306 波士可多拉 Aggron - Aggression(进攻) + Iron(铁)
307 玛沙那 Meditite - Meditate(沉思,冥想)
308 恰雷姆 Medicham - Meditate(沉思,冥想) + Champ(焦急)
309 落雷兽 Electrike - Electric(电的) + Tyke(野狗)
310 雷电兽 Manectric - Mane(鬃毛) + Electric(电的)
311 正电拍拍 Plusle - Plus(正)
312 负电拍拍 Minun - Minus(负)
313 电荧虫 Volbeat - Volt(伏特) + Beetle(甲虫)
314 甜甜萤 Illumise - Illumination(照明)
315 毒蔷薇 Roselia - Rose(蔷薇,玫瑰) + Azalea(杜鹃花)
316 溶食兽 Gulpin - Gulp(吞咽) + In(进入)
317 吞食兽 Swalot - Swallow(吞咽) + A lot(许多)
318 利牙鱼 Carvanha - Carnivore(食肉动物) + Piranha(食人鱼,水虎鱼)(**产于南美的一种鱼类)
319 巨牙鲨 Sharpedo - Shark(鲨鱼) + Torpedo(鱼雷)
320 吼吼鲸 Wailmer - Whale(鲸) + Wilmer(威尔默)
321 吼鲸王 Wailord - Whale(鲸) + Lord(地主)
322 呆火驼 Numel - New(新的) + Camel(骆驼)
323 喷火驼 Camerupt - Camel(骆驼) + Erupt(爆发,喷出)
324 煤炭龟 Torkoal - Tortoise(龟) + Charcoal(木炭)
325 跳跳猪 Spoink - Spring(跳跃,弹力) + Oink(呼噜声)(**猪发出的声响)
326 噗噗猪 Grumpig - Grump(坏脾气) + Pig(猪)
327 晃晃斑 Spinda - Spin(旋转) + Panda(熊猫)
328 大鄂蚁 Trapinch - Trap(诡计) + Pinch(收缩)
329 超音波幼虫 Vibrava - Vibrate(震动,摇摆)
330 沙漠蜻蜓 Flygon - Fly(飞翔) + Dragon(龙)
331 沙漠奈亚 Cacnea - Cactus(仙人掌) + Sabonea(**沙漠奈亚的日文名称)
332 梦歌奈亚 Cacturne - Cactus(仙人掌) + Nocturnal(夜的)
333 青眠鸟 Swablu - Swan(天鹅) + Blue(蓝色的)
334 七夕青鸟 Altaria - Altitude(高处) + Air(空中)
335 猫鼬斩 Zangoose - Mongoose(猫鼬)
336 饭匙蛇 Seviper - Sever(切断) + Viper(毒蛇)
337 月石 Lunatone - Lunar(月亮的) + Stone(石)
338 太阳岩 Solrock - Solar(太阳的) + Rock(岩石)
339 泥
泥鳅 Barboatch - Barbette(炮塔) + Poach(把…踏成泥浆)
340 鲶鱼王 Whiscash - Whisker(腮须) + Catfish(鲶鱼)
341 龙虾小兵 Corphish - Corpse(尸体) + Fish(鱼)
342 铁螯龙虾 Crawdaunt - Crawfish(小龙虾) + Daunt(沮丧)
343 天平偶 Baltoy - Balance(天平) + Toy(玩具)
344 念力土偶 Claydol - Clay(粘土) + Doll(玩偶)
345 触手百合 Lileep - Lily(百合) + Sleep(睡眠)
346 摇篮百合 Cradily - Cradle(摇篮) + Sleep(睡眠)
347 太古羽虫 Anorith - Anamalocaris + Rith
348 太古盔甲 Armaldo - Armor(装甲)
349 笨笨鱼 Feebas - Feeble(虚弱的,无力的) + Bass(鲈鱼)
350 美纳斯 Miltotic - Melodic(有旋律的,调子美妙的)
351 飘浮泡泡 Castform - Forecast(预测,预兆) + Transform(转换,改变)
352 变隐龙 Kecleon - Chameleon(变色龙)
353 怨影娃娃 Shuppet - Sheet(薄片) + Puppet(木偶)
354 诅咒娃娃 Banette - Bane(祸害) + Marionette(牵线木偶)
355 夜骷颅 Duskull - Dusk(黄昏) + Skull(头骨)
356 夜巨人 Dusclops - Dusk(黄昏) + Cyclops(独眼巨人)(**希腊神话人物)
357 热带龙 Tropius - Tropical(热带的) + Citrus(柑橘类的植物)
358 风铃铃 Chimecho - Chime(和谐的声音) + Echo(回音)
359 阿勃梭鲁 Absol - Absolute(绝对的)
360 小果然 Wynaut - "Why Not?"(为什么不呢?)
361 雪童子 Snorunt - Snow(雪) + Runt(矮小的动物)
362 冰鬼护 Glalie - Glacier(冰河)
363 海豹球 Spheal - Sphere(球体) + Seal(海豹)
364 海魔狮 Sealeo - Seal(海豹) + Leo(狮子,狮子座)
365 帝牙海狮 Walrein - Walrus(海象) + Reign(统治)
366 珍珠贝 Clamperl - Clamp(夹子,夹紧) + Pearl(珍珠)
367 猎斑鱼 Huntail - Hunt(打猎) + Tail(尾部)
368 樱花鱼 Gorebyss - Gore(血块) + Abyss(深渊)
369 古空棘鱼 Relicanth - Relic(遗物,废墟) + Cealocanth(**鱼的一种)
370 爱心鱼 Luvdisc - Love(爱情) + Discus Fish(铁饼鱼)
371 宝贝龙 Bagon - Baby(婴孩) + Dragon(龙)
372 甲壳龙 Shelgon - Shell(贝壳) + Dragon(龙)
373 暴蝾螈 Salamence - Salamander(火蜥蜴) + Menace(威胁)
374 铁哑铃 Beldum - Dumbbell(哑铃)
375 金属怪 Metang - Metal(金属) + Angstrom(埃)
376 巨金怪 Metagross - Metal(金属) + Gross(全部的,粗野的)
377 雷吉洛克 Regirock - Rock(岩石)
378 雷吉艾斯 Regice - Ice(冰)
379 雷吉斯奇鲁 Registeel - Steel(钢铁)
380 拉帝亚斯 Latias - Lateo(隐藏的)(**Lateo为拉丁文)
381 拉帝欧斯 Latios - Lateo(隐藏的)(**Lateo为拉丁文)
382 盖欧卡 Kyogre - Kai(水) + Orca(虎鲸,逆戟鲸)
383 固拉多 Groudon - Ground(地面)
384 烈空坐 Rayquaza - Ray(光线) + Quasar(恒星状球体,类星体)
385 基拉祈 Jirachi - Jirachi(希望,愿望)(**Jirachi为俄罗斯文)
386 代欧奇希斯 Deoxys - Deoxyribonucleic Acid(脱氧核糖核酸)(**缩写为DNA)
金贝 Munchlax - Munch(用力咀嚼) + Relax(休息)在本文(也是本系列的第五部分)中,Teodor 解释了什么是面向对象编程,何时使用它以及它是如何在 Perl 中工作的。面向对象编程(OOP)是一种强大的编程技术,但它不是万能药。优秀的程序员必须理解如何使用它,并且必须知道何时依赖更传统的编程技术。在 Perl 中使用 OOP 很简单。与 C++ 和 Java 等限制性更强的 OOP 语言不同,Perl 中的 OOP 很少对程序员施加强制性约束。OOP 是对每一名程序员的工具箱的必要补充,并且是用于扩展可用 Perl 解决的问题范围的非常有用的技术。什么是面向对象编程(OOP)?OOP 是一种用于解决问题的编程方法或通用方法。与之相反,算法是用于解决特定问题的 特定方法。OOP 天生是一种强有力的方法;它往往使过程型和函数型编程方法与该问题较少相关,并且除非它与过程型和函数型编程方法的混合对其极其有益,否则它们之间不会很好地结合在一起。在 Perl 中,这种强大的力量有所减弱,但仍然很好地存在着。 本文讨论 Perl 中的 OOP 对比函数型和过程型编程的基本知识,并演示如何在 Perl 程序和模块中使用 OOP。请记住,本文只是一篇概述,而不是对 Perl 中 OOP 所有方面的详尽解释。这样的详尽解释需要几本书才能讲完,并且已经被写过几次了。有关详细信息,请参阅本文稍后的 参考资料。 究竟什么是 OOP?OOP 是一种通过使用对象来解决问题的技术。在编程术语中,对象是这样一些实体:它们的特性和行为是解决手头问题所必需的。这个定义本应该更详细些,但是做不到,因为当今计算机行业中 OOP 方法的种类之多简直难以想象。在Perl 编程环境中,OOP 并不是使用该语言所必需的。Perl 版本 5 和更高版本鼓励使用 OOP,但确切地说不要求这样做。所有 Perl 库都是模块,这意味着它们至少使用 OOP 的基本部分。而且,大多数 Perl 库都作为对象实现,这意味着用户必须通过良好定义的接口将它们作为具有特定行为和特性的 OOP 实体来使用。回页首基本的 OO 编程语言特性通常,有三个语言特性是 OOP 编程语言所必需的。它们是继承、多态性和封装。Perl 支持继承。当一个对象(子对象)使用另一个对象作为起点(父对象),并且随后在需要时修改其特性和行为时,就要用到 继承。子-父关系是 OOP 所必需的,因为它使得在其它对象基础上构建对象成为可能。这种重用是使 OOP 成为程序员宠儿的好处之一。 有两种继承:单一继承和多重继承。 单一继承要求子对象只有一个父对象,而 多重继承更自由(与实际生活一样,在编程过程中具有两个以上的父对象会导致混乱并使子对象难以工作,因此,不要过多使用多重继承)。尽管两个或两个以上的父对象实际上很少见,但 Perl 支持多重继承。 多态性(来自希腊语,表示“很多形态”)是使一个对象被看成另一个对象的技术。这有点复杂,那么我举个例子。比方说,您有一个绵羊牧场,里面有四只绵羊(绵羊属),但是您刚刚买了两只山羊(山羊属)和一只德国牧羊犬(犬科犬属)。您一共有多少动物?您得把所有的绵羊、山羊和狗加起来,结果是 7 只。其实您刚刚应用了多态性,即为了计算,把三种不同种类的动物当成一种通用类型(“动物”)对待。如果您把绵羊、山羊和狗当成哺乳动物看待,这就是一个简单的信心飞跃。生物学家每天都以这种方式使用多态性,而程序员则以从其它科学领域“窃用”(我是指“重用”)好主意闻名。Perl 完全支持 多态性。但它用得不是很频繁,因为 Perl 程序员看起来更喜欢用对象特性、而不是通过修改继承的行为来修改通用行为。这意味着您更可能看到创建三个 IO::Socket::INET 对象的代码:一个对象用于在端口 234 接收和发送 UDP 包、一个对象用于在端口 80 接收 TCP 包,还有一个对象在端口 1024 发送 TCP 包,而不大会看到对第一种情况使用 IO::Socket::INET::UDPTransceiver 、对第二种情况使用 IO::Socket::INET::TCPReceiver 而对第三种情况使用 IO::Socket::TCPTransmitter 的代码。这就象是在生物学术语中说狗和山羊都是哺乳动物,但是山羊属于山羊属,而狗属于犬属。 OOP 纯化论者认为每件事都应该正确分类,但是 Perl 程序员根本不是纯化论者。他们往往更不拘束于 OOP 规则,这使得他们在聚会中比 OOP 纯化论者更快乐。封装指的是以这样一种方式包含对象行为和特性:除非对象作者允许,否则用户无法访问该对象的行为和特性。在这种方式下,对象用户无法做不准他们做的事,无法访问不准他们访问的数据,并且通常是有害数据。Perl 通常用松弛的方法封装。请参阅 清单1。 回页首为什么说 OOP 是一种强有力的方法?返回到我们最初的 OOP 如何是一种强有力的方法这一主题,我们现在可以看到 OOP 结合了几个关键的概念,这使得它很难与过程型和函数型编程(PP 和 FP)混合使用。首先,PP 和 FP 都没有继承或类多态性的概念,因为在 PP 和 FP 中根本就没有类。在 PP 和 FP 中存在封装,但只在过程型级别,从来不作为类或对象属性封装。既然程序员不怕麻烦来使用这些基本的 OOP 工具,那就意味着程序员通常更可能对整个项目使用 OOP,而不是混合不兼容的方法。有人可能争论说所有程序最终都归结为指令的过程型执行,因此无论 OOP 程序实现得有多纯,每个 OOP 程序都在其函数(也称为方法)和创建第一个对象(该对象做其余工作)的代码中包含过程型代码。甚至象 Java 那样接近“纯”OOP 的语言都无法避免地需要一个 main() 函数。因此,看起来 OOP 只是 PP 的一个子集。但是这种 OOP 向序列指令的归结和实际为每个操作所执行的汇编程序指令一样,都不是系统架构设计师或程序员所关心的事。请记住,OOP 本身只是一种方法,而不是目的。 OOP 与过程型编程方法合作得不是很好,因为它集中在对象上,而过程型编程基于过程(我们将 过程大致定义为不使用 OOP 技术就可以得到的函数,而将 方法定义为只有在对象中才能得到的函数)。正如方法一样,过程只是由用户调用的函数,但是二者之间有一些差异。 过程不使用对象数据。必须在它们的参数列表中为它们传递数据,或者它们必须使用所在作用域中的数据。过程可以访问调用它时传递给它的任何数据,甚至整个程序的全局数据。方法应该只访问它们对象的数据。实际上,方法的函数作用域通常是包含该方法的对象。常常发现过程使用全局数据,尽管只有在绝对必要时才应该这样做。应该尽快重写使用全局数据的方法。过程通常用几个参数调用其它过程。方法应该只有几个参数,并且它们调用其它方法的次数比其它过程更多。函数型编程(FP)与 OOP 配合不好有几个原因。最重要的原因是 FP 基于用来解决问题的详细函数型方法,而 OOP 则使用对象来表达概念,并且,与 OOP 方法只能在包含它们的对象中使用不同,FP 过程得到处使用。综上所述,我们现在可以解释 Perl 为什么是混合 OOP、FP 和 PP 方法的最佳语言之一。回页首Perl 是如何将 OOP 与过程型和函数型编程结合起来的?Perl 是一种松弛的语言。它极力让程序员以他们认为方便的任何方式做他们想做的任何事。这与 Java 和 C++ 之类的语言截然不同。例如,如果程序员原本没有声明变量,Perl 乐于允许程序员自动创建变量(尽管不鼓励这样做,并且可以通过使用高度推荐的“use strict”编译指示阻止)。如果您要向自己的脚开枪,Perl 会给您十发子弹和一个激光瞄准镜,然后站在一旁鼓励您。因此,Perl 是一种非常便于滥用方法的语言。别害怕。没关系。例如,访问内部的对象数据、实时更改类和实时重定义方法都是允许的。Perl 方式是:允许程序员为了编码、调试和执行效率的目的而去打破规则。如果这有助于完成工作,那么没关系。因此,Perl 本身可能是程序员最好的朋友,也可能是最坏的敌人。如果混合 OOP、FP 和 PP 意味着打破规则,那么为什么任何人都想要混合 OOP、FP 和 PP 呢?让我们回头想想这个问题。什么是 OOP、FP 和 PP?它们只是现有的为编程团队服务的编程方法、概念集和规则集。OOP、FP 和 PP 是工具,每名程序员的首要工作就是要了解他的工具。如果一名程序员在排序散列时不能使用 FP 的 Schwartzian 变换,而是编写他自己的 Sort::Hashtable ,或者不能重用 Sys::Hostname 模块,而是编写过程代码来获得系统主机名,那么这个程序员是在浪费时间、精力和金钱,并且降低了代码质量和可靠性。 一个编程团队可能会因为它们最熟知的工具而沾沾自喜,对它们来说,这可能正是最坏的事。如果一个团队只使用象计算机编程行业那样令人冲动和充满创新的行业中所保证的可用工具的一部分,那么它在几年之后注定要变得毫无用处。程序员应该能够结合任何使工作更有效、代码更好以及使团队更具创新能力的方法。Perl 认可并鼓励这种态度。回页首OOP 的好处OOP 的好处太多,本文难以列举。正如我在前面提到的那样,有很多关于该主题的书籍。这些好处中的一小部分是:易于代码重用、代码质量的改进、一致的接口和可适应性。因为OOP 建立在类和对象的基础之上,所以重用 OO 代码意味着在需要时只需简单地导入类。至今为止,代码重用是使用 OOP 的唯一最主要原因,也是 OOP 在当今业界中的重要性和流行性日益增加的原因所在。这里有一些陷阱。例如,在当前的情况下,以前问题的解决方案可能不理想,并且文档库编制得很差,以至于理解和使用文档编制很差的库所花的时间可能与重新编写库的时间一样长。系统架构设计师的工作是看到和避免这些陷阱。使用OOP 可以提高代码质量,因为封装减少了数据毁坏(“友好之火”),而继承和多态性则减少了必须编写的新代码数量和复杂性。在代码质量和编程创新之间有一个微妙的平衡,这最好留给团队去发现,因为它完全取决于团队的构成和目的。OOP 继承和重用使得在代码中实现一致的接口变得简单,但是并不能说所有的 OO 代码都有一致的接口。程序员仍然必须遵循通用的体系结构。例如,团队应该在错误日志记录的格式和接口方面达成一致,最好通过一个允许日后扩展并且极其易用的示范模块接口来这样做。只有在那时,每名程序员才能承诺使用该接口,而不是无规则的 print 语句,因为他们会认识到在出现下一个错误日志记录函数时,学习该接口的努力不会白费。可适应性在编程中是一个有些含糊的概念。我愿意把它定义成对环境和用法更改的接受性和预见性。对于编写良好的软件来说,可适应性很重要,因为所有的软件必须随着外部世界而进化。编写良好的软件应该很容易进化。OOP 通过模块设计、改进的代码质量和一致的接口确保新操作系统或者新报告格式不要求对体系结构的核心作出根本更改,从而有助于软件的进化。回页首如何在 Perl 中使用 OOP不管您是否相信,Perl 中的 OOP 对初级和中级用户都不难,甚至对高级用户也没那么复杂。根据我们到目前为止所讨论的有关 OOP 的复杂工作方式,您可能不这么认为。然而,Perl 却乐意对程序员施加尽可能少的限制。Perl OOP 就象烤肉(恕我比喻不当)。每个人都带来自己的肉,并以自己喜爱的方式烤肉。甚至还有烤肉的团队精神也是那样,就象可以轻易在不相关的对象之间共享数据一样。我们必须采取的第一步是理解 Perl 包。包类似于 C++ 中的名称空间和 Java 中的库:象用来将数据限制在特定区域的围栏。然而,Perl 包只是为程序员提供建议。缺省情况下,Perl 不限制包之间的数据交换(尽管程序员可以通过词法变量这样做)。清单1. 包名、切换包、在包之间共享数据和包变量#!/usr/bin/perl # note: the following code will generate warnings with the -w switch, # and won‘t even compile with "use strict". It is meant to demonstrate # package and lexical variables. You should always "use strict". # pay attention to every line! # this is a global package variable; you shouldn‘t have any with "use strict" # it is implicitly in the package called "main" $global_sound = " "; package Cow; # the Cow package starts here # this is a package variable, accessible from any other package as $Cow::sound $sound = "moo"; # this is a lexical variable, accessible anywhere in this file my $extra_sound = "stampede"; package Pig; # the Pig package starts, Cow ends # this is a package variable, accessible from any other package as $Pig::sound $Pig::sound = "oink"; $::global_sound = "pigs do it better"; # another "main" package variable # we‘re back to the default (main) package package main; print "Cows go: ", $Cow::sound; # prints "moo" print "\nPigs go: ", $Pig::sound; # prints "oink" print "\nExtra sound: ", $extra_sound; # prints "stampede" print "\nWhat‘s this I hear: ", $sound; # $main::sound is undefined! print "\nEveryone says: ", $global_sound; # prints "pigs do it better" 请注意,可以在所有三个包(“main”、“Pig”和“Cow”)中访问文件作用域内的词法变量 $extra_sound ,因为在该示例中它们是在同一文件中定义的。通常,每个包在它自己文件内部定义,以确保词法变量为该包所私有。这样就可以实现封装。(有关详细信息,请运行“ perldoc perlmod”。) 接下来,我们要将包与类关联。就 Perl 而言,类只是一个奇特的包(相反,对象由 bless() 函数特别创建)。同样,Perl 对 OOP 规则实施得不是很严格,以便程序员不为其所约束。 new() 方法是类构造器的惯用名称(尽管按照 Perl 惯有的不严格方式,您可以使用任意名称)。当将类实例化成对象时都要调用它。 清单2. barebones 类#!/usr/bin/perl -w package Barebones; use strict; # this class takes no constructor parameters sub new { my $classname = shift; # we know our class name bless {}, $classname; # and bless an anonymous hash } 1; 可以通过将清单 2 中的代码放入任何目录内名为 Barebones.pm 的文件中,然后在该目录中运行以下命令来测试该代码(这表示:“在库路径中包括当前目录,使用 Barebones 模块,然后创建一个新的 Barebones 对象”):perl -I. -MBarebones -e ‘my $b = Barebones->new()‘ 例如,可以在 new() 方法中放入 print 语句,以便看到 $classname 变量所拥有的内容。 如果调用 Barebones::new() 而不是 Barebones->new() ,类名将不会传递到 new() 。换句话说, new() 将不作为构造器,而只是普通的函数。 您可能要问:为什么需要传入 $classname 。为什么不直接用 bless {}, "Barebones"; ?因为继承的缘故,这个构造器可能被一个从 Barebones 继承、但名称却不是 Barebones 的类调用。您可能正在用错误的名称享有错误的事,而在 OOP 中,那是个坏主意。 除了new() 之外,每个类都需要成员数据和方法。定义它们就象编写几个过程一样简单。 清单3. 带有成员数据和方法的类#!/usr/bin/perl -w package Barebones; use strict; my $count = 0; # this class takes no constructor parameters sub new { my $classname = shift; # we know our class name $count++; # remember how many objects bless {}, $classname; # and bless an anonymous hash } sub count { my $self = shift; # this is the object itself return $count; } 1; 可以用以下命令测试该代码:perl -I. -MBarebones -e ‘my $b = Barebones->new(); Barebones->new(); print $b->count‘ 您应该得到 ‘2‘ 这个结果。构造器被调用两次,它修改词法变量( $count),该变量被限制在 Barebones 包的作用域,而 不是每个Barebones 对象的作用域。应该将对象本身范围内的数据存储在对象本身中。在 Barebones 的示例中,被享有成对象的是匿名散列。请注意我们怎样才能在每次调用该对象的方法时访问该对象,因为对该对象的引用是传递给那些方法的第一个参数。 有几个特殊的方法,例如 DESTROY() 和AUTOLOAD(),Perl 在某些条件下会自动调用它们。 AUTOLOAD() 是用来允许动态方法名称的全捕获(catch-all)方法。 DESTROY() 是对象析构器,但是除非您确实非常非常需要,否则不应该使用它。在 Perl 中使用析构器通常表明您还在象 C/C++ 程序员那样考虑问题。 让我们看一下继承。在 Perl 中通过更改 @ISA 变量来这样做。您只需将一个类名表赋值给该变量即可。就是这样。您可以在 @ISA 中放入任何东西。您可以使您的类成为 Satan 的子类。Perl 不在乎(尽管您的牧师、部长、教长、犹太学者等可能在乎)。 清单4. 继承#!/usr/bin/perl -w package Barebones; # add these lines to your module‘s beginning, before other code or # variable declarations require Animal; # the parent class @ISA = qw(Animal); # announce we‘re a child of Animal # note that @ISA was left as a global default variable, and "use # strict" comes after its declaration. That‘s the easiest way to do it. use strict; use Carp; # make your new() method look like this: sub new { my $proto = shift; my $class = ref($proto) || $proto; my $self = $class->SUPER::new(); # use the parent‘s new() method bless ($self, $class); # but bless $self (an Animal) as Barebones } 1; 这些是 Perl 中 OOP 的最基本知识。Perl 语言中还有很多您应该探索的知识。人们已经撰写了很多有关这一主题的书籍。如果想阅读的话,请参考 参考资料。 回页首h2xs:您最好的新朋友您不想拥有一个可以为您编写 Perl 类、还可以编写文档(POD)框架并且通常可以通过正确地完成这些事而使您的生活轻松一些的工具吗?Perl 正好带有这种工具: h2xs。 别忘了使用几个重要标志:“ -A -n Module”。利用这些标志,h2xs 将生成一个名为“Module”、且里面全是有用文件的框架目录。这些文件是: Module.pm ,模块本身,带有已经编写好的框架文档。 Module.xs ,用于将您的模块与 C 代码链接。(有关详细信息,请运行“ perldoc perlxs”。) MANIFEST ,用于打包的文件列表。 test.pl ,框架测试脚本。 Changes ,对该模块所做更改的日志。 Makefile.PL,makefile 生成器(用“ perl Makefile.PL ”运行它。) 您无需使用所有这些文件,但是在您确实需要它们时知道它们在那里是很好的。
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!