ÿØÿà JFIF    ÿÛ „ !.%+&8&+/1555$;@;4?.451 4,$,44444444444414444444444444444444444444444444444444ÿÀ  á á" ÿÄ     ÿÄ ?    !1AQaq"2‘¡±ÁðBRbrÑá#‚’¢²3S CñÿÄ   ÿÄ !    !1QAa‘2ÿÚ   ? 5˜Z¯V¦cø)›t/? z¨±>Õ5€¶‹Á¤·¼z¼Ü¬+ñ®v¤¨_ˆR­BFn©—˜ý®ç̝P8gýt·ÉSTŦˆìät?þé¼íìN/Þa)ì–í6ô… Ï¿øÃj´¿KÇü]ÿ ªô¹-eKànëÕHTx}ýSÜ›ÿ ”7Ø×&µ<¦  ¥ÑO¶[Ù¯ä¨ÞÃÿ PZ-¬;#õ|•oaÿ ©CìÞz3˜öː/¤­ñTûIØ}š^ mÓ%ªxˆ¥ÉŸu=Z+ISe¿45™¼u;ú&WØ÷€æßQ™®{|íx*TC“#ZŠìZ§²‹ 6pv…³¿¡äª*áZÐ%ÒOáˆo"x«OHk w±æ+¬V(kMúŸ5Vö«$ ÁrÏbàb57/luR ¸ÑÛj Òµì`Мq­û žICÀÊ•©4€Âcà¨Ï€O´<èÐ:›ù(Ë^L8þ‘ÍÌ#¸Ð_Ì©ÙK(Öz 4¬û+¸;ü’V’84‘¬ÃŽ:[â‡ÔÌáõp¢~§ªlæ£ö{®G>J¼"°‡7¯ÆÉèßû ‹É‹§ÁòÃýâßî ^ƾÙõ‹×óH#«LP½ïX=xÑÍ$|W?•~• îëÔ©ª‹ {ÝT…Kÿ ”hûâá)J*ö˜–ÔU;iÇ€/ ÆþjóZ\ýwØ=Ìm ºèËL9 ýèÆð/¨’¥öo=nË.%Îì ŽÕ¯È|{Oj²ƒE6e/ßdÄõ²Ìâ1O®ò×TsəԸhOMýíMˆ¿¼H˜l²,7Â¥#MF/Úf°Ö½± ¸–dr‹NýÊ íjqx{œÉ ä-È ¦ øÄër¨q°ð †nцýÑÄÆ’mä…n<0È™;ÁÝá¯ÁZƒ7FÀmì­ É&9ˆîéi¶ùN§Y• ÃZãAâ?•‡©‰ , ó¾IŸŠc1 4â&y­&pŠ­6;M À 0¹qç»p.á …ŸÅáK@%6·y6ƒ‰3?”úºŽ‰éX5ªPT §µ!=Mž«Ú½‹ÅgÂSâÉaþÓoö–¯ÁÔìR>5éÿ üs¶ÆUcÌ kÇR ]ÿ ù¬¼«VŽ;Â|‡~¢¦”ÏŰæ {L™Õ°Óv¹ò¸írޡעCÃ!íVÕ {¶»sŒNPg/ "uÕbkm²“$ďå¿é¹§°½æz¯6 †s¿!s–wÚÝ“™Œ °.ûj>·+™Òa…©Œ&rÝÎtÛë긪Ît’LAVp%c Úý[ÄzJ¾ÇàXXç@˜ó<êL]·T˜¾¥1Ó©V‡g´æ½¦Ý@¹óø!_@´ÞâSÁ —S3™•& ]@JHÚý©ZŽ €×æÔr»Áf!‡yÞ4Mv*èÓã_{‘åóUuљØ«Oïé*®EvÑ Œ÷‡U \"㪒ÍK+À 4“M¡ï:0¥5í!'<@î´”>Ç»&Z–ïCCV˜Ì5Šo&îhè.žû |ÓK©h$s6KìŒëã)¹hI¦GïOåóI;ììü#É$Š0…Ææ¥TØ.5­¾gn´ “ÂÖ\:hœ89G)J@„}œ:’Ò{/Š"¦_Æ×7Æ3VÇŠÊa]ÚŒÙ€Ä–=®uÁßâACZƒ§§£ Qnâ:«,×{tyø¬iÛcœÜÄ€H½ÄÍCk´÷šß .W'b¤Íåh]÷€=,Žv×cÚEÚHXJX¶îo¨FÒtèöŸ>ªª6[J®Fµ£sGÁeqõfe\íjÒÐïÄÐGˆe1Ø‹.Ø”‘Ëuø Y­ˆÜ ŽG|zùªüMpDnQWÄ”%JŠ™)â*p@Örš«ÕT2Ð%ˆG#ª„ ·¤!°ŸOTÂT¸aÚ%4&h™LµšØüÐ.F¿²ÐÞ_Ç‚¾ÅÃaÜ÷09Æ q€öy˜v‡85õN÷]¬äѼóS{°_MެúÔ#°Ç¸0åÞè2ëôPcvÆw9®ií1Ä8F™˜à‰´+‰Ik1òÝ7“Ñ×ÒsÝ\x‚h`ÞÑ`ó"|µEcý£n˜h`}GÞ !±ù²Ápü²ß6 0ïi󜵩SÈÇ7˜-ÕURO˜¦´f$ªž-Í6(œ}<„ éc øs]ŽŽ„*—¾ ìdŽ„)méª\¿êÎIg¾ØÞ~I#C/¼¼´EÁÈŽi8“©õådô·>euä ƒ'Ê×लR1ÉJE1ÐAát`t;ÇР%Ý<‡¥„ÍÆ`×Oyó)õiI€ñQaŸ4Ûù\áàaÃÔ¹HÃu¹*k€¦<„e S‡&õÏ B!ŽhüÞ`yj}mªf×\¿ Ç~æ­9‡û\՞Ǖg²1Žû5V7 !àöšm° c`ܬøÇìµÒ'P"?…´Ö,"§^•õލsÔ)6˜sæéÍR¼ ò|Sl”‹7 nPW Gòú÷½§O¯‡„l¡kSÞŒr½PÊ@æ¢pŽ-mÿ #Ÿ˜Àº¶Áä¦;ïÔæ$1££`“Õ>„—·ž)ßð³ñ#Ï Ô$¶œ‰ÊE‹À;÷º ¯«P:Ñ”8–IÊtpÞ3ª“>ê“þës4ò2OÏÕ­±zô†Õ§‰.÷ä¸;¿˜“'œ›žª}«Œ{ª±Ì 9ÔóÞÕ‡0 $íWV3Üì¬ —@kÝ4@¿r¼±½¬™›?øØæ´'Áé®CË3-g$˜ö‡×auÚi´Žp/êÛ æF›Ú2v‹ã¿¿,nB1̨ƃqÞa5͝@&Æû“él÷ \C²½UÍc ¯k×¢U ÖéQå™—-r wô ÞÏ<Ò=&=ÿ Ôê Òêˈt,i—;LîÜ á¸*ÚÃ1$êL•LÍ <É)ýÐà’ ;F™{ƒ™˜€&'}‚ãÄK`¡ÞT@I;®žZóè‚s’7®°›+§O­Åq©é»²9<Ô J ¼9O’HL»Ùïì¸rk¼Ž_ý‘TŸu[²ßÚŒ·ü÷B%¯E ŸÔX5êO´ Ç•€’I0 ÉJX` ñ¹õ%;µŸD‘«´€àwÒ™U ûئžÖö\×®×´8 ½‡ºÐÆÓ§?Àkmœ=;d5*@-ì0F Rªýš[Ü6âö̃ڸr*KA9· u*µæ£?U¸Âêí†8@¦X4 e-ò„0s{ HâUpU?¼mñRa°®a%Ð'tÉ×’\¾ÊÉ]t›h>·(Ë@R¼¡Ãt h}’O÷au<+nT…Ö…MӐ??Óe95 q>í/;&JSû °¯ÊéÞ øƒ*Ã2½Ài&:nôUl=¾¿5eˆ3”ñc|Ú2V”>„»&eE;«ÚäC p¢Û úy 9š[ŒÌx¼擼A&DåÒ¯ˆ¤ÀÌ;"˜ ÏQä¸åhÊ}Ûq«Û0WžÒ|»€ø®öCm5•\ÇÀ§Pe3£]0ÃàLDÉ‰1øªxjgwT‚÷¿LΨK‹›ùs—xˆÜ±µ kæ¸f‰‰ÜGk/LÛØ6d9ò¶ùA{ƒA3š/¬D¬khÓk‰`˜"㯒r¿±Óã jx‡°e}<Ñø\3y:'À•/h½Í€Ç4~g ?Û(¼]v‘ªlKÎâ~?O‚W%{Ì:“'©úNq¾›úo(X’¥¯ˆ nFê{Ç€ü?º'ë ø‹ì Þ09ŒÌç9Æ —ËC`j@ÓÄ(+a‹un¸#ÂꟋ{K`‘ÑÍÍ'à´»/Û,KW;Þ4²þð ï Nm|~fGÏ(…³Ã)«1ö­Õ ¥‡¨©ƒÃ™ü-s=à=U66Ï«Ýc蓦W¹íž®›nÔ%êÇìŒ<#Ü×84ån®Ð ÒåOC` ñânÑs‡¢ç 1õ%Îhì½Ã½® e:ݼUZo™`  ÅZŸŒÊ«ê1ÏÄo$q¹Þ€©ˆhÐÉä¯ñ[!…Ú˜àJ:x2$Íß&PåT£6ç— ‡Í*4Ýšçjÿ ‰É nófÐ ó(L5C•åÆ\rMÒ@ò }y-W}™üýVù—ú¢=Ù”c®‘< M ž ´Phr ¦©TD ‘ù.$´÷O‡‘V2Æò.=IUŒ=ž‡â¬i™aþÓåÙ?òUø'ØÖ•.~* šTŒ!•-×áºTâ®ä#õü'´ eýlYÅÓeÕKÂrT"CÚ@u!Óxƒ{š3€}1¿(r}%«nËamjÑ%ÑNEò v ˜à  σöK³,*º.àzù¨™Ó ÚçâU¦*¿ 9{%Ö¹ njûdaXöb) kÛÆ±ûÓ\°M7ˆÂ=û›ç¿Ã‚­V»Cg–8ÙêE- j)k$º`Ã-ùEýeBÆÇ]c¡°ñty&Òd0nõ'¡W+ƒ*|–øµFa\GQªEAÔp5\Ǽ·¼Ç8·õ -â§Ú[ ‡ uZeÖ 3}×d'+¹:ð+K†Û®s!Ï$úe€<Û”x)1»a­¡LC]¸µík…ÚàA»AYº{†ªS[¦5HÒ7ù --,ísòDØ€èk ÞÀîÜ ò@â( ËNˆë›4ô½•/¦o‡€Û7 ê•ÆêòðÜy'Án½µ á˜ݦ ndeo…[ì¶Ê,¥R³Ä=À±—–ß;£™´ñSâ*g§”ïaið‘Jå~™ÓÞ ß³Õ¢»8x埒²52>AÊb&-÷\7´éÄù€T˜,w;3{ï˜k…à¹ÄqÀ«œ{€\ ˆ¾[´¨јr &Úé„Ívˆ±8†¿]|¬ņ4I×pÞS1ÈÖz‰#Ìv‡G!YNògñ:màTz¢Ý1ô©^O=~ë|5Bã™ç•¼µõ•bÆ@úÕS¬ÈŒ#¬zünrŸ û” Z²•èðV"ÁHÚý©wÝ €7¼Ìu1hÑa3Éä û f$o¿É ™Ú›ÝçnpÒ3äÌ3†Í§,Äï]$‰/pê †«À¼¸e9­Æê_C]žƒ·ý·frÁN«, E=›Çq -‰öŒ:aÏ¿±í&£Í:-} 84‘ÿ eƒQÑeëSsuiA ³g㟥ú£?ÿ ʼn*”“÷aühe:ÊWa@ÒÞk±eØ] F Ô—r.åä˜ @ö¥ªZoÐýYL·¥S²G/‡ñ <~*ZÆ´è>JlòàÛÆ½ÿ 窘ìGN¢:I®KšJp/`íIÁÀõ#Ä-€ö­šµŒoF4|ÆQØÆ@Ì|£Ô…¢À{9˜è½Üó›€ôYÒÎYsið;ís¤€à²ˆ‚4qÉVŒI$ ‰"° æµ8cXGjœˏ¡Aâý•ËÜ¢ûï e·çLx']á"oÅÎê3¯Ç—¹”ó0nå‚âg{Œñ> S´˜îè°g238‚ãköÝfÚd´6Ò€;ò÷±¢™¼›º ¢Æ'¥Ðx'e¬ç ]bÈÆV¢ó‹kýBO ðÊâ$Ÿ!×T 3Mýמ žìٍàÌü‘8÷€àæØ8æ©6‰©L´«…oãpð„~Çk‰!ñ;‹”ÛžÍ àž±z Ÿôû øŸÝužÏ;ÿ #|u6™Þ¬ÚˆÐõA4¶â|ôl|Ê2ŽÇ¤ÝÅÇY.<#Aí.k§hóF‚”Y; M½Ö4hŸ4&›­¿tès´%FìL¥£Ãk‰ÇT¤haÁ¤ÚxfÉ`ÑìË›>i 3t‚:,–+^÷´–{Û–Nxi"x‘Ûg î¨>¥Õ܁ùZH,2Û“:8xÊ¢Çí9.É-Ìâã-=çjwµS˜dütžçwýGòú®®ûº_ˆýx$–¡ãøO EÚÛÏ÷R„×w+3£Á£öUMyR²¹âŒ°š›¸Ñãò9§Ó_Dl+Ùßc›úšGÅÌc†Ž!Ko=¶.‘Îÿ c²(2®V mª.ÿ ¹B›¹å ù„öŸSV>™ü¯$y:G¢Z×àøúdî¹û­·ýÇ´:•c LÍõi_‹ö+ÎæGÊè>OŠ•äž´§Þ{X}¨1ÚTc›»Qþ•êô°t¿OP?eæ~É{5]•ÙR£r5†nZ\ã@ &îJõ ¾àC°þV>fé¥/ü5ñÊIº_é5 ;e­h<@ Ä&æÃëE%;X,ÒãÆÞ`Oò¦kŸm#˜!ÀyÄ¢| óLšò¥Ä` ¶R=|ÈCâh5ò3DˆïF†ðÒ#ÅìÛœ?¸yhBãœí ZxßÎÄhºRK„`Þödvײ™ÀÈÑÒgŒuY w³%†ƒÓzõ ÖÏp‚dH®¦A´ù§»ÓÇMæ~)ˆð‡û:ù&Ä •vGD´À n ݇¼Ö8Fö óáà£~Ë¥x`oK|Ä?fxiØü%pìR>éò+Û±éÎ>núlFŤ'tq8LZÏvÃ?„¡ß±È⽆¯³íü@x|PöUäèØã¡ð‚ŒAìÏ"vÍwóŸÍ{ ý0.z È•Ö{,N¡£¡ŸKÕÙž>Ýœþ ÍÀ°<×EA!Å‚D™IúOÍ¡>ôG}Â` ÍßkÜL™Ž Þð™ {IøF²¹òQ3&!ÃÂÞz.d&Ï-sH¸,Ôõ˜ŽP€ 77ˆÝ¼ÊëÜw =cÕ Ú,ØÐ5ÎYÐ)ì´öœgŒ[¤ßv㙑8心>h]§µháYš£²ºÑ.{Ï7Sð•?´~×SÃKýJÛ˜ ™Íäiúu<µX¶1õ^kâçIÑ£sZ4h>j*ÔšD:4­¿_ ÷¸ Õxæÿ ¸?Mù _•­ÊÐ ä ÷ý ÑwL œ­ïnTkÛUÍN©ë:¦fV ¶ÜÔÜMªÅâA½–¿R×TXš-%iTÊT•‡Ù‚JôϐZxWÑè‰f‰òG º ×Õû2aZ7OU3[“×AT–ÞŒ…-‘¤”Ì ì&(ˆ¿­•ƒkï’:ðY¦W‘ Å)“†‘˜³Åtcø˜ñTÂwÚÇ4|üLÇªí–v- qˆèU qPE.†â‘˜µ Æ,ÐÅs]8¾„oúÑ i>ÜxxÈó)ƒ ´æÁâØ$À‰vžŸf$Ž |ãw;ÀÁIJ»b` {¦Ó¤Ú$©YÀ‘n@Óïž«9J¼êG m¤ ܯ¹ÌW4€ÐÒÅÛ‡#褕Ÿn-?í|с¥÷Ú¹¬'´ÞÜ9ÓK `hê£SÄSà?7—Wí_´…óB›»:=Ãïq`<8ñÓŒÑlú2d¬ê³£hÖ[l|$vÝro~'R®‰§°ñmY ͧäP |PUª¹·:3Œ[Û{Xÿ ºâ@‚W–Äé u‚ ¯´*=íή.pûÒdt @G‰¬ s¸ ëÉücr ÞæÑ¨Ê@>¤¢Ö±. Þ'¯°ÌME[YéïĵÂCå½ Ué©Áû'Ê9%eÔðNU”ë‘ÌsD3/®+UI˜9h.WC”빓$#:pz:YÓ ¿xž* ³$Í +$kñAŠ‹†¢ Uê>¸)_š¬÷©ßAÂÔb9ÇU ¯¾á•9¯ÏÏ÷O÷¼¼Fähal1‰3Ì[Ïr•´UCksNÐ] R‘¸¥H+§Šé†c©vÖÞ0iÓ76s†î!§=ß ¼~Ô'°Ãmäoäš³ªøi1úÉ)³yV8 CLÄØÁ‘WYïi€H6ÖÑiámø^ÈY´°Ñ7¥Û*—Ñ©L«Qƒï—Ùrÿ ›£Ð*š¸ˆL©ˆ$ˆ ÷¾D§9È®«qbqC)–ˆïv´çñsÑVT­Ø, <àïºÀO«Jý·õ àfPìð .wFšir´þ’2_Y *Æ€x\« ì€9š@ Ž|F⇥ˆkZ@hÖÄ0t¿-<“‹qµ¾*ZL¤Ú)&BJpÓF5=$„at*Zš$’ÑtdûÝRI1 2މ$€$I$#‰SÞ’Hë¬ï;Á$¡t$’`<(ñÇt)$‡Ð.Êf¢X’Kt=Éé$‚ˆªè¢oÝëòI%Rgcª÷ŠyI%¡‰ÿ !ñ)´õ $¤ Ô’IIGÿÙ#!/usr/bin/perl eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' if 0; # ^ Run only under a shell #!/usr/bin/perl =head1 NAME corelist - a commandline frontend to Module::CoreList =head1 DESCRIPTION See L for one. =head1 SYNOPSIS corelist -v corelist [-a|-d] | // [] ... corelist [-v ] [ | // ] ... corelist [-r ] ... corelist --utils [-d] [] ... corelist --utils -v corelist --feature [] ... corelist --diff PerlVersion PerlVersion corelist --upstream =head1 OPTIONS =over =item -a lists all versions of the given module (or the matching modules, in case you used a module regexp) in the perls Module::CoreList knows about. corelist -a Unicode Unicode was first released with perl v5.6.2 v5.6.2 3.0.1 v5.8.0 3.2.0 v5.8.1 4.0.0 v5.8.2 4.0.0 v5.8.3 4.0.0 v5.8.4 4.0.1 v5.8.5 4.0.1 v5.8.6 4.0.1 v5.8.7 4.1.0 v5.8.8 4.1.0 v5.8.9 5.1.0 v5.9.0 4.0.0 v5.9.1 4.0.0 v5.9.2 4.0.1 v5.9.3 4.1.0 v5.9.4 4.1.0 v5.9.5 5.0.0 v5.10.0 5.0.0 v5.10.1 5.1.0 v5.11.0 5.1.0 v5.11.1 5.1.0 v5.11.2 5.1.0 v5.11.3 5.2.0 v5.11.4 5.2.0 v5.11.5 5.2.0 v5.12.0 5.2.0 v5.12.1 5.2.0 v5.12.2 5.2.0 v5.12.3 5.2.0 v5.12.4 5.2.0 v5.13.0 5.2.0 v5.13.1 5.2.0 v5.13.2 5.2.0 v5.13.3 5.2.0 v5.13.4 5.2.0 v5.13.5 5.2.0 v5.13.6 5.2.0 v5.13.7 6.0.0 v5.13.8 6.0.0 v5.13.9 6.0.0 v5.13.10 6.0.0 v5.13.11 6.0.0 v5.14.0 6.0.0 v5.14.1 6.0.0 v5.15.0 6.0.0 =item -d finds the first perl version where a module has been released by date, and not by version number (as is the default). =item --diff Given two versions of perl, this prints a human-readable table of all module changes between the two. The output format may change in the future, and is meant for I, not programs. For programs, use the L API. =item -? or -help help! help! help! to see more help, try --man. =item -man all of the help =item -v lists all of the perl release versions we got the CoreList for. If you pass a version argument (value of C<$]>, like C<5.00503> or C<5.008008>), you get a list of all the modules and their respective versions. (If you have the C module, you can also use new-style version numbers, like C<5.8.8>.) In module filtering context, it can be used as Perl version filter. =item -r lists all of the perl releases and when they were released If you pass a perl version you get the release date for that version only. =item --utils lists the first version of perl each named utility program was released with May be used with -d to modify the first release criteria. If used with -v then all utilities released with that version of perl are listed, and any utility programs named on the command line are ignored. =item --feature, -f lists the first version bundle of each named feature given =item --upstream, -u Shows if the given module is primarily maintained in perl core or on CPAN and bug tracker URL. =back As a special case, if you specify the module name C, you'll get the version number of the Unicode Character Database bundled with the requested perl versions. =cut BEGIN { pop @INC if $INC[-1] eq '.' } use Module::CoreList; use Getopt::Long qw(:config no_ignore_case); use Pod::Usage; use strict; use warnings; use List::Util qw/maxstr/; my %Opts; GetOptions( \%Opts, qw[ help|?! man! r|release:s v|version:s a! d diff|D utils feature|f u|upstream ] ); pod2usage(1) if $Opts{help}; pod2usage(-verbose=>2) if $Opts{man}; if(exists $Opts{r} ){ if ( !$Opts{r} ) { print "\nModule::CoreList has release info for the following perl versions:\n"; my $versions = { }; my $max_ver_len = max_mod_len(\%Module::CoreList::released); for my $ver ( grep !/0[01]0$/, sort keys %Module::CoreList::released ) { printf "%-${max_ver_len}s %s\n", format_perl_version($ver), $Module::CoreList::released{$ver}; } print "\n"; exit 0; } my $num_r = numify_version( $Opts{r} ); my $version_hash = Module::CoreList->find_version($num_r); if( !$version_hash ) { print "\nModule::CoreList has no info on perl $Opts{r}\n\n"; exit 1; } printf "Perl %s was released on %s\n\n", format_perl_version($num_r), $Module::CoreList::released{$num_r}; exit 0; } if(exists $Opts{v} ){ if( !$Opts{v} ) { print "\nModule::CoreList has info on the following perl versions:\n"; print format_perl_version($_)."\n" for grep !/0[01]0$/, sort keys %Module::CoreList::version; print "\n"; exit 0; } my $num_v = numify_version( $Opts{v} ); if ($Opts{utils}) { utilities_in_version($num_v); exit 0; } my $version_hash = Module::CoreList->find_version($num_v); if( !$version_hash ) { print "\nModule::CoreList has no info on perl $Opts{v}\n\n"; exit 1; } if ( !@ARGV ) { print "\nThe following modules were in perl $Opts{v} CORE\n"; my $max_mod_len = max_mod_len($version_hash); for my $mod ( sort keys %$version_hash ) { printf "%-${max_mod_len}s %s\n", $mod, $version_hash->{$mod} || ""; } print "\n"; exit 0; } } if ($Opts{diff}) { if(@ARGV != 2) { die "\nprovide exactly two perl core versions to diff with --diff\n"; } my ($old_ver, $new_ver) = @ARGV; my $old = numify_version($old_ver); if ( !Module::CoreList->find_version($old) ) { print "\nModule::CoreList has no info on perl $old_ver\n\n"; exit 1; } my $new = numify_version($new_ver); if ( !Module::CoreList->find_version($new) ) { print "\nModule::CoreList has no info on perl $new_ver\n\n"; exit 1; } my %diff = Module::CoreList::changes_between($old, $new); for my $lib (sort keys %diff) { my $diff = $diff{$lib}; my $was = ! exists $diff->{left} ? '(absent)' : ! defined $diff->{left} ? '(undef)' : $diff->{left}; my $now = ! exists $diff->{right} ? '(absent)' : ! defined $diff->{right} ? '(undef)' : $diff->{right}; printf "%-35s %10s %10s\n", $lib, $was, $now; } exit(0); } if ($Opts{utils}) { die "\n--utils only available with perl v5.19.1 or greater\n" if $] < 5.019001; die "\nprovide at least one utility name to --utils\n" unless @ARGV; warn "\n-a has no effect when --utils is used\n" if $Opts{a}; warn "\n--diff has no effect when --utils is used\n" if $Opts{diff}; warn "\n--upstream, or -u, has no effect when --utils is used\n" if $Opts{u}; my $when = maxstr(values %Module::CoreList::released); print "\n","Data for $when\n"; utility_version($_) for @ARGV; exit(0); } if ($Opts{feature}) { die "\n--feature is only available with perl v5.16.0 or greater\n" if $] < 5.016; die "\nprovide at least one feature name to --feature\n" unless @ARGV; no warnings 'once'; require feature; my %feature2version; my @bundles = map { $_->[0] } sort { $b->[1] <=> $a->[1] } map { [$_, numify_version($_)] } grep { not /[^0-9.]/ } keys %feature::feature_bundle; for my $version (@bundles) { $feature2version{$_} = $version =~ /^\d\.\d+$/ ? "$version.0" : $version for @{ $feature::feature_bundle{$version} }; } # allow internal feature names, just in case someone gives us __SUB__ # instead of current_sub. while (my ($name, $internal) = each %feature::feature) { $internal =~ s/^feature_//; $feature2version{$internal} = $feature2version{$name} if $feature2version{$name}; } my $when = maxstr(values %Module::CoreList::released); print "\n","Data for $when\n"; for my $feature (@ARGV) { print "feature \"$feature\" ", exists $feature2version{$feature} ? "was first released with the perl " . format_perl_version(numify_version($feature2version{$feature})) . " feature bundle\n" : "doesn't exist (or so I think)\n"; } exit(0); } if ( !@ARGV ) { pod2usage(0); } while (@ARGV) { my ($mod, $ver); if ($ARGV[0] =~ /=/) { ($mod, $ver) = split /=/, shift @ARGV; } else { $mod = shift @ARGV; $ver = (@ARGV && $ARGV[0] =~ /^\d/) ? shift @ARGV : ""; } if ($mod !~ m|^/(.*)/([imosx]*)$|) { # not a regex module_version($mod,$ver); } else { my $re; eval { $re = $2 ? qr/(?$2)($1)/ : qr/$1/; }; # trap exceptions while building regex if ($@) { # regex errors are usually like 'Quantifier follow nothing in regex; marked by ...' # then we drop text after ';' to shorten message my $errmsg = $@ =~ /(.*);/ ? $1 : $@; warn "\n$mod is a bad regex: $errmsg\n"; next; } my @mod = Module::CoreList->find_modules($re); if (@mod) { module_version($_, $ver) for @mod; } else { $ver |= ''; print "\n$mod $ver has no match in CORE (or so I think)\n"; } } } exit(); sub module_version { my($mod,$ver) = @_; if ( $Opts{v} ) { my $numeric_v = numify_version($Opts{v}); my $version_hash = Module::CoreList->find_version($numeric_v); if ($version_hash) { print $mod, " ", $version_hash->{$mod} || 'undef', "\n"; return; } else { die "Shouldn't happen" } } my $ret = $Opts{d} ? Module::CoreList->first_release_by_date(@_) : Module::CoreList->first_release(@_); my $msg = $mod; $msg .= " $ver" if $ver; my $rem = $Opts{d} ? Module::CoreList->removed_from_by_date($mod) : Module::CoreList->removed_from($mod); my $when = maxstr(values %Module::CoreList::released); print "\n","Data for $when\n"; if( defined $ret ) { my $deprecated = Module::CoreList->deprecated_in($mod); $msg .= " was "; $msg .= "first " unless $ver; $msg .= "released with perl " . format_perl_version($ret); $msg .= ( $rem ? ',' : ' and' ) . " deprecated (will be CPAN-only) in " . format_perl_version($deprecated) if $deprecated; $msg .= " and removed from " . format_perl_version($rem) if $rem; } else { $msg .= " was not in CORE (or so I think)"; } print $msg,"\n"; if( defined $ret and exists $Opts{u} ) { my $upstream = $Module::CoreList::upstream{$mod}; $upstream = 'undef' unless $upstream; print "upstream: $upstream\n"; if ( $upstream ne 'blead' ) { my $bugtracker = $Module::CoreList::bug_tracker{$mod}; $bugtracker = 'unknown' unless $bugtracker; print "bug tracker: $bugtracker\n"; } } if(defined $ret and exists $Opts{a} and $Opts{a}){ display_a($mod); } } sub utility_version { my ($utility) = @_; require Module::CoreList::Utils; my $released = $Opts{d} ? Module::CoreList::Utils->first_release_by_date($utility) : Module::CoreList::Utils->first_release($utility); my $removed = $Opts{d} ? Module::CoreList::Utils->removed_from_by_date($utility) : Module::CoreList::Utils->removed_from($utility); if ($released) { print "$utility was first released with perl ", format_perl_version($released); print " and later removed in ", format_perl_version($removed) if $removed; print "\n"; } else { print "$utility was not in CORE (or so I think)\n"; } } sub utilities_in_version { my ($version) = @_; require Module::CoreList::Utils; my @utilities = Module::CoreList::Utils->utilities($version); if (not @utilities) { print "\nModule::CoreList::Utils has no info on perl $version\n\n"; exit 1; } print "\nThe following utilities were in perl ", format_perl_version($version), " CORE\n"; print "$_\n" for sort { lc($a) cmp lc($b) } @utilities; print "\n"; } sub max_mod_len { my $versions = shift; my $max = 0; for my $mod (keys %$versions) { $max = max($max, length $mod); } return $max; } sub max { my($this, $that) = @_; return $this if $this > $that; return $that; } sub display_a { my $mod = shift; for my $v (grep !/0[01]0$/, sort keys %Module::CoreList::version ) { next unless exists $Module::CoreList::version{$v}{$mod}; my $mod_v = $Module::CoreList::version{$v}{$mod} || 'undef'; printf " %-10s %-10s\n", format_perl_version($v), $mod_v; } print "\n"; } { my $have_version_pm; sub have_version_pm { return $have_version_pm if defined $have_version_pm; return $have_version_pm = eval { require version; 1 }; } } sub format_perl_version { my $v = shift; return $v if $v < 5.006 or !have_version_pm; return version->new($v)->normal; } sub numify_version { my $ver = shift; if ($ver =~ /\..+\./) { have_version_pm() or die "You need to install version.pm to use dotted version numbers\n"; $ver = version->new($ver)->numify; } $ver += 0; return $ver; } =head1 EXAMPLES $ corelist File::Spec File::Spec was first released with perl 5.005 $ corelist File::Spec 0.83 File::Spec 0.83 was released with perl 5.007003 $ corelist File::Spec 0.89 File::Spec 0.89 was not in CORE (or so I think) $ corelist File::Spec::Aliens File::Spec::Aliens was not in CORE (or so I think) $ corelist /IPC::Open/ IPC::Open2 was first released with perl 5 IPC::Open3 was first released with perl 5 $ corelist /MANIFEST/i ExtUtils::Manifest was first released with perl 5.001 $ corelist /Template/ /Template/ has no match in CORE (or so I think) $ corelist -v 5.8.8 B B 1.09_01 $ corelist -v 5.8.8 /^B::/ B::Asmdata 1.01 B::Assembler 0.07 B::Bblock 1.02_01 B::Bytecode 1.01_01 B::C 1.04_01 B::CC 1.00_01 B::Concise 0.66 B::Debug 1.02_01 B::Deparse 0.71 B::Disassembler 1.05 B::Lint 1.03 B::O 1.00 B::Showlex 1.02 B::Stackobj 1.00 B::Stash 1.00 B::Terse 1.03_01 B::Xref 1.01 =head1 COPYRIGHT Copyright (c) 2002-2007 by D.H. aka PodMaster Currently maintained by the perl 5 porters Eperl5-porters@perl.orgE. This program is distributed under the same terms as perl itself. See http://perl.org/ or http://cpan.org/ for more info on that. =cut