[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"sanity-TimfcySpCZ-EfRXzsWPPXU7LJTlQggNpEQYtI_gw280":3,"sanity--aSyEFC5PJd_i0MDnAvnv2v2eUBZQvvR-I2S3jxRxko":1149},{"data":4,"sourceMap":-1},{"latestPodcast":5,"latestReleases":14,"post":39,"recent":1124},[6],{"_id":7,"publishedAt":8,"slug":9,"sponsored":12,"title":13},"f83eb5f0-1237-487f-84d8-f7abf2318c39","2026-06-25T07:40:00.000Z",{"_type":10,"current":11},"slug","code-isnt-causing-your-production-failures",null,"Code isn’t the only thing causing your production failures",[15,21,27,33],{"_id":16,"publishedAt":17,"slug":18,"title":20},"eb5b66eb-9410-4329-83bb-22bbff39402a","2026-04-28T13:00:00.000Z",{"_type":10,"current":19},"turn-scattered-knowledge-into-trusted-intelligence","Turning scattered knowledge into trusted intelligence: Stack Internal 2026.3",{"_id":22,"publishedAt":23,"slug":24,"title":26},"369c2401-b62e-4a37-8ff8-bf603023ecad","2026-03-02T15:03:00.988Z",{"_type":10,"current":25},"what-s-new-at-stack-overflow-march-2026","What’s new at Stack Overflow: March 2026",{"_id":28,"publishedAt":29,"slug":30,"title":32},"5e9053a4-07ea-447c-91ea-29e0b6228537","2026-02-02T15:00:00.000Z",{"_type":10,"current":31},"what-s-new-at-stack-overflow-february-2026","What’s new at Stack Overflow: February 2026",{"_id":34,"publishedAt":35,"slug":36,"title":38},"a1b538eb-a8a6-46d0-80a1-ac70ec9bb935","2026-01-05T10:00:00.000-05:00",{"_type":10,"current":37},"what-s-new-at-stack-overflow-january-2026","What’s new at Stack Overflow: January 2026",{"_createdAt":40,"_id":41,"_rev":42,"_system":43,"_type":46,"_updatedAt":47,"author":48,"body":65,"comments":1094,"dateUrl":1095,"excerpt":1096,"image":1097,"legacyBody":1100,"product":12,"publishedAt":1103,"slug":1104,"sponsored":12,"tags":1106,"title":1123,"visible":1094},"2023-05-24T12:51:01Z","wp-post-20358","nvZcks16ldBXxsacAElCfY",{"base":44},{"id":41,"rev":45},"LIB4H7UiOBRX1pcyrgMXGU","blogPost","2026-05-11T18:35:24Z",[49],{"_createdAt":50,"_id":51,"_rev":52,"_type":53,"_updatedAt":54,"avatar":55,"bio":60,"employee":61,"name":62,"slug":63},"2023-05-23T16:27:18Z","wp-author-cap-20364","dgl3SCUzppW3U2LvCoP6c0","blogAuthor","2023-06-20T15:05:12Z",{"_type":56,"asset":57},"image",{"_ref":58,"_type":59},"image-8cd45d431fbae9aea4fb787c78860675846e8c32-720x720-jpg","reference","Girish is experienced software developer with an interest in cryptography networking and email threat control. He is cycling or cooking when not writing software.\n\nhttps://spamcheetah.com","none","Girish Venkatachalam",{"current":64},"girish-venkatachalam",[66,77,85,93,101,117,127,135,143,162,192,200,208,216,224,232,240,281,289,297,357,373,405,431,450,458,466,474,477,493,496,504,507,515,518,526,542,577,593,601,610,618,658,685,701,719,727,735,743,751,759,767,804,812,820,828,836,866,874,906,924,943,951,959,967,975,1025,1054,1062,1070,1078,1086],{"_key":67,"_type":68,"children":69,"markDefs":75,"style":76},"a193e72f73e3","block",[70],{"_key":71,"_type":72,"marks":73,"text":74},"a193e72f73e30","span",[],"If you love UNIX/Linux/BSD like me, then you have definitely learnt Perl and programmed in it. I am pretty certain you have also used Perl more than once, perhaps several times. The language was created in 1987 as a general purpose UNIX scripting language, but has undergone many changes since then (even spawning another programming language, Raku).",[],"normal",{"_key":78,"_type":68,"children":79,"markDefs":84,"style":76},"5e8f4cf5d85d",[80],{"_key":81,"_type":72,"marks":82,"text":83},"5e8f4cf5d85d0",[],"You may have used it for occasional sys admin tasks, in your tool chain, or to enhance some shell scripts that needed more gas. But Perl is more than just scripting.",[],{"_key":86,"_type":68,"children":87,"markDefs":92,"style":76},"726913837ccd",[88],{"_key":89,"_type":72,"marks":90,"text":91},"726913837ccd0",[],"But from the amount of talk about Perl on Reddit or Stack Overflow, you might think it’s dead. It’s far from dead, and is still very relevant to software engineering today.",[],{"_key":94,"_type":68,"children":95,"markDefs":100,"style":76},"0d4f57306b0c",[96],{"_key":97,"_type":72,"marks":98,"text":99},"0d4f57306b0c0",[],"20092010201120122013201420152016201720182019202020212022Year0.00%0.50%1.00%1.50%2.00%2.50%3.00%3.50%4.00%% of Stack Overflow questions that monthTagnode.jsperlbash",[],{"_key":102,"_type":68,"children":103,"markDefs":114,"style":76},"10acfdea9d7e",[104,109],{"_key":105,"_type":72,"marks":106,"text":108},"10acfdea9d7e0",[107],"em","From ",{"_key":110,"_type":72,"marks":111,"text":113},"10acfdea9d7e1",[107,112],"fb18b862b45b","https://insights.stackoverflow.com/trends?tags=perl%2Cbash%2Cnode.js",[115],{"_key":112,"_type":116,"href":113,"reference":12},"link",{"_key":118,"_type":68,"children":119,"markDefs":125,"style":126},"a243ed78b51d",[120],{"_key":121,"_type":72,"marks":122,"text":124},"a243ed78b51d0",[123],"strong","What makes it special?",[],"h2",{"_key":128,"_type":68,"children":129,"markDefs":134,"style":76},"7a34dcb184db",[130],{"_key":131,"_type":72,"marks":132,"text":133},"7a34dcb184db0",[],"Perl is a high-level, interpreted language. It is open source and free to contribute to.",[],{"_key":136,"_type":68,"children":137,"markDefs":142,"style":76},"ff718944148b",[138],{"_key":139,"_type":72,"marks":140,"text":141},"ff718944148b0",[],"Perl’s primary strength is in text processing. Be it a regex-based approach or otherwise, Perl is excellent for logfile analysis, text manipulation, in-place editing of files, and scouring structured text files for specific field values.",[],{"_key":144,"_type":68,"children":145,"markDefs":159,"style":76},"dc294fb1f23b",[146,150,155],{"_key":147,"_type":72,"marks":148,"text":149},"dc294fb1f23b0",[],"Perl is very Unix-friendly. It can serve as a wrapper around Unix tools and is fully integrated into OS semantics. As a result, it excels at pipes, file slurping, inter-process communication, and other geeky tasks. It can create Unix daemons or server processes that run in the background. We can easily invoke a Perl daemon to avoid spending hours working on C and reduce ",{"_key":151,"_type":72,"marks":152,"text":154},"dc294fb1f23b1",[153],"4715e08e39e2","security flaws",{"_key":156,"_type":72,"marks":157,"text":158},"dc294fb1f23b2",[],".",[160],{"_key":153,"_type":116,"href":161,"reference":12},"https://portswigger.net/daily-swig/c-is-least-secure-programming-language-study-claims#:~:text=The%20top%20vulnerabilities%20found%20in,programming%20language%20in%20the%20list.",{"_key":163,"_type":68,"children":164,"markDefs":187,"style":76},"01a9b6c75a26",[165,169,174,178,183],{"_key":166,"_type":72,"marks":167,"text":168},"01a9b6c75a260",[],"Like ",{"_key":170,"_type":72,"marks":171,"text":173},"01a9b6c75a261",[172],"c273757f240d","npm",{"_key":175,"_type":72,"marks":176,"text":177},"01a9b6c75a262",[]," for Node.js, Perl has a vibrant development community in ",{"_key":179,"_type":72,"marks":180,"text":182},"01a9b6c75a263",[181],"ce3c9652af6f","CPAN",{"_key":184,"_type":72,"marks":185,"text":186},"01a9b6c75a264",[],", with a vast archive of Perl modules. You can find a module to do anything you want. Most modules are written in pure Perl, though some performance intensive modules have an XS component that uses C for performance.",[188,190],{"_key":172,"_type":116,"href":189,"reference":12},"https://www.npmjs.com/",{"_key":181,"_type":116,"href":191,"reference":12},"https://metacpan.org/",{"_key":193,"_type":68,"children":194,"markDefs":199,"style":76},"2089825b726f",[195],{"_key":196,"_type":72,"marks":197,"text":198},"2089825b726f0",[],"Through CPAN, you can wrap many databases—SQLite, MySQL, Postgres, and more—in Perl code using database driver (DBD) modules. These export the DB operations using Perl’s own semantics into unified portable Perl code that hides the complexities of the database.",[],{"_key":201,"_type":68,"children":202,"markDefs":207,"style":76},"523369291c0f",[203],{"_key":204,"_type":72,"marks":205,"text":206},"523369291c0f0",[],"Perl supports arrays, hashes, and references using which you can code in very powerful ways without thinking deeply about data structures or algorithms. Most CPAN modules give you both a procedural style as well as the object oriented one. By giving you that choice, you can pretty much do your task your own way.",[],{"_key":209,"_type":68,"children":210,"markDefs":215,"style":126},"0895b35866e2",[211],{"_key":212,"_type":72,"marks":213,"text":214},"0895b35866e20",[123],"What sort of problems make Perl a natural?",[],{"_key":217,"_type":68,"children":218,"markDefs":223,"style":76},"ef4f4ad4dd30",[219],{"_key":220,"_type":72,"marks":221,"text":222},"ef4f4ad4dd300",[],"As stated above, Perl does very well with text processing. It can scour CSV files for data fields based on complex regex statements. It is a tool of choice for parsing log files. It can quickly edit settings files. Perl is also a natural for various format conversions, generating PDFs, HTML, or XML.",[],{"_key":225,"_type":68,"children":226,"markDefs":231,"style":76},"a0ee60809ceb",[227],{"_key":228,"_type":72,"marks":229,"text":230},"a0ee60809ceb0",[],"Since the early days of the internet, Perl served as the foundation of a lot of basic networking tasks: common gateway interface (CGI), MIME decoding in emails, or managing websockets between a client and server. It has evolved a lot since these early times, becoming a source of inspiration for other ecosystems and getting inspiration from other languages to evolve.",[],{"_key":233,"_type":68,"children":234,"markDefs":239,"style":76},"e53c2e83ad25",[235],{"_key":236,"_type":72,"marks":237,"text":238},"e53c2e83ad250",[],"For power Unix users, Perl allows you to automate nearly any action that you like. You can create daemons—small, constantly running programs—that will automatically take actions when their conditions are met.",[],{"_key":241,"_type":68,"children":242,"markDefs":274,"style":76},"e84c5dcd8961",[243,247,252,256,261,265,270],{"_key":244,"_type":72,"marks":245,"text":246},"e84c5dcd89610",[],"Testing is at the core of Perl culture. Excellent ",{"_key":248,"_type":72,"marks":249,"text":251},"e84c5dcd89611",[250],"7faec05a3fae","test toolkits and infrastructures",{"_key":253,"_type":72,"marks":254,"text":255},"e84c5dcd89612",[]," lay at the foundation of the community favorites methodologies. Any module uploaded to the CPAN will pass automatically through the *",{"_key":257,"_type":72,"marks":258,"text":260},"e84c5dcd89613",[259],"eba4b91d2c97","CPAN Testers Reports",{"_key":262,"_type":72,"marks":263,"text":264},"e84c5dcd89614",[],", a multi-platform testing ground that has operated since 1998. Standard Perl tests can also be run in common ",{"_key":266,"_type":72,"marks":267,"text":269},"e84c5dcd89615",[268],"f04990015fda","build pipelines",{"_key":271,"_type":72,"marks":272,"text":273},"e84c5dcd89616",[]," and CI/CD.",[275,277,279],{"_key":250,"_type":116,"href":276,"reference":12},"http://www.modernperlbooks.com/mt/2009/04/a-test-infected-culture.html",{"_key":259,"_type":116,"href":278,"reference":12},"http://www.cpantesters.org/page/about.html",{"_key":268,"_type":116,"href":280,"reference":12},"https://stackoverflow.com/questions/533553/perl-build-unit-testing-code-coverage-a-complete-working-example",{"_key":282,"_type":68,"children":283,"markDefs":288,"style":126},"a4dc9645a57e",[284],{"_key":285,"_type":72,"marks":286,"text":287},"a4dc9645a57e0",[123],"A flexible and fun way to code",[],{"_key":290,"_type":68,"children":291,"markDefs":296,"style":76},"90c9da1973b3",[292],{"_key":293,"_type":72,"marks":294,"text":295},"90c9da1973b30",[],"In today’s event-loop-centric asynchronous world of JavaScript, Node.js, and TypeScript, Perl developed ways to face the challenges of non-blocking programming.",[],{"_key":298,"_type":68,"children":299,"markDefs":348,"style":76},"0ed6f7b730b3",[300,304,310,314,318,322,327,331,336,340,345],{"_key":301,"_type":72,"marks":302,"text":303},"0ed6f7b730b30",[],"Despite asynchronicity not being a fundamental part of Perl's core, it is as always possible to extend the language through CPAN modules. A robust example is ",{"_key":305,"_type":72,"marks":306,"text":309},"0ed6f7b730b31",[307,308],"68204687f17d","code","Future::AsyncAwait",{"_key":311,"_type":72,"marks":312,"text":313},"0ed6f7b730b32",[]," that ",{"_key":315,"_type":72,"marks":316,"text":317},"0ed6f7b730b33",[107],"provides syntax for deferring and resuming subroutines",{"_key":319,"_type":72,"marks":320,"text":321},"0ed6f7b730b34",[]," with the async and await keywords. An alternative is ",{"_key":323,"_type":72,"marks":324,"text":326},"0ed6f7b730b35",[325,308],"85d2517e9b64","Mojo::Promise",{"_key":328,"_type":72,"marks":329,"text":330},"0ed6f7b730b36",[],", a Perl-ish implementation of ",{"_key":332,"_type":72,"marks":333,"text":335},"0ed6f7b730b37",[334],"6100b1769619","Promises/A+",{"_key":337,"_type":72,"marks":338,"text":339},"0ed6f7b730b38",[]," and a superset of ",{"_key":341,"_type":72,"marks":342,"text":344},"0ed6f7b730b39",[343],"a099ae515dd0","ES6 Promises",{"_key":346,"_type":72,"marks":347,"text":158},"0ed6f7b730b310",[],[349,351,353,355],{"_key":307,"_type":116,"href":350,"reference":12},"https://metacpan.org/pod/Future::AsyncAwait",{"_key":325,"_type":116,"href":352,"reference":12},"https://metacpan.org/pod/Mojo::Promise",{"_key":334,"_type":116,"href":354,"reference":12},"https://promisesaplus.com/",{"_key":343,"_type":116,"href":356,"reference":12},"https://duckduckgo.com/?q=%5Cmdn%20Promise",{"_key":358,"_type":68,"children":359,"markDefs":372,"style":76},"540ab9f52cb1",[360,364,368],{"_key":361,"_type":72,"marks":362,"text":363},"540ab9f52cb10",[],"Perl includes a number of specialized operators that process data in unique ways. You can use the diamond ",{"_key":365,"_type":72,"marks":366,"text":367},"540ab9f52cb11",[308],"\u003C>",{"_key":369,"_type":72,"marks":370,"text":371},"540ab9f52cb12",[]," operator to eat up any stream, file, socket, pipe, named pipe, whatever.",[],{"_key":374,"_type":68,"children":375,"markDefs":404,"style":76},"c52deaa6bddc",[376,380,384,388,392,396,400],{"_key":377,"_type":72,"marks":378,"text":379},"c52deaa6bddc0",[],"The regex operator ",{"_key":381,"_type":72,"marks":382,"text":383},"c52deaa6bddc1",[308],"=~",{"_key":385,"_type":72,"marks":386,"text":387},"c52deaa6bddc2",[]," opens the door to the rich world of Perl regular expressions, that can reduce many lines of complex code to a couple of ",{"_key":389,"_type":72,"marks":390,"text":391},"c52deaa6bddc3",[308],"match",{"_key":393,"_type":72,"marks":394,"text":395},"c52deaa6bddc4",[]," and ",{"_key":397,"_type":72,"marks":398,"text":399},"c52deaa6bddc5",[308],"replace",{"_key":401,"_type":72,"marks":402,"text":403},"c52deaa6bddc6",[]," operations.",[],{"_key":406,"_type":68,"children":407,"markDefs":428,"style":76},"c6035ad8eeb9",[408,412,416,420,425],{"_key":409,"_type":72,"marks":410,"text":411},"c6035ad8eeb90",[],"Perl emphasizes the ",{"_key":413,"_type":72,"marks":414,"text":415},"c6035ad8eeb91",[107],"get what you want the way you want",{"_key":417,"_type":72,"marks":418,"text":419},"c6035ad8eeb92",[]," philosophy, also known as ",{"_key":421,"_type":72,"marks":422,"text":424},"c6035ad8eeb93",[423],"d5e88d1855b4","TMTOWTDI",{"_key":426,"_type":72,"marks":427,"text":158},"c6035ad8eeb94",[],[429],{"_key":423,"_type":116,"href":430,"reference":12},"https://en.wikipedia.org/wiki/There%27s_more_than_one_way_to_do_it",{"_key":432,"_type":68,"children":433,"markDefs":447,"style":76},"1ab5e552cd1a",[434,438,443],{"_key":435,"_type":72,"marks":436,"text":437},"1ab5e552cd1a0",[],"Perl is multi-paradigm. In addition to procedural or object-oriented, it allows functional programming. Depending of the situation, it allows to choose the most accurate programming paradigm. Providing a low level object-oriented system, robust object toolkits like ",{"_key":439,"_type":72,"marks":440,"text":442},"1ab5e552cd1a1",[441],"742a679a2bf5","Moose",{"_key":444,"_type":72,"marks":445,"text":446},"1ab5e552cd1a2",[]," can be used for production code (from CPAN, not a core module). Such toolkits greatly simplify the object-oriented paradigm for Perl.",[448],{"_key":441,"_type":116,"href":449,"reference":12},"https://metacpan.org/pod/Moose",{"_key":451,"_type":68,"children":452,"markDefs":457,"style":126},"5f4753d27739",[453],{"_key":454,"_type":72,"marks":455,"text":456},"5f4753d277390",[123],"Looking at some code",[],{"_key":459,"_type":68,"children":460,"markDefs":465,"style":76},"6f995ffee640",[461],{"_key":462,"_type":72,"marks":463,"text":464},"6f995ffee6400",[],"Let us examine some code samples to get some perspective by creating a sha256 digest of a string.",[],{"_key":467,"_type":68,"children":468,"markDefs":473,"style":76},"b689220acb0c",[469],{"_key":470,"_type":72,"marks":471,"text":472},"b689220acb0c0",[],"This is how you do in Node.js:",[],{"_key":475,"_type":308,"code":476,"markDefs":12},"99f3784c8ffd","const {\n  createHash\n} = require('node:crypto');\n\nconst hash = createHash('sha256');\ndata = 'Stack Overflow is cool';\nhash.update(data);\nconsole.log(hash.copy().digest('hex'));\n",{"_key":478,"_type":68,"children":479,"markDefs":492,"style":76},"7dbfe0247a87",[480,484,488],{"_key":481,"_type":72,"marks":482,"text":483},"7dbfe0247a870",[],"Let's examine two ways (",{"_key":485,"_type":72,"marks":486,"text":487},"7dbfe0247a871",[107],"more ways",{"_key":489,"_type":72,"marks":490,"text":491},"7dbfe0247a872",[]," could be possible) to do this in Perl. One is the procedural approach:",[],{"_key":494,"_type":308,"code":495,"markDefs":12},"813fb2ea4c61","use Digest::SHA qw(sha256_hex);\n\nmy $data = 'Stack Overflow is cool';\nmy $hexdigest = sha256_hex($data);\nprint(\"Procedural interface :: \" . $hexdigest . \"\\n\");\n",{"_key":497,"_type":68,"children":498,"markDefs":503,"style":76},"2c5b2ef78c9e",[499],{"_key":500,"_type":72,"marks":501,"text":502},"2c5b2ef78c9e0",[],"Another is the object-oriented approach:",[],{"_key":505,"_type":308,"code":506,"markDefs":12},"6e2fab3c0121","use Digest::SHA\n\nmy $sha = Digest::SHA->new('sha256');\n$sha->add($data);               # feed data into stream\nmy $hexdigest = $sha->hexdigest;\n\nprint(\"OO interface ::\" . $hexdigest);\n",{"_key":508,"_type":68,"children":509,"markDefs":514,"style":76},"2e2048f5f2bd",[510],{"_key":511,"_type":72,"marks":512,"text":513},"2e2048f5f2bd0",[],"Here’s how you do it in Python:",[],{"_key":516,"_type":308,"code":517,"markDefs":12},"28e04efc54e2","import hashlib\nm = hashlib.sha256()\nm.update(b\"Stack Overflow is cool\")\n\nprint(m.hexdigest())\n",{"_key":519,"_type":68,"children":520,"markDefs":525,"style":126},"69763ddf640a",[521],{"_key":522,"_type":72,"marks":523,"text":524},"69763ddf640a0",[123],"Debugging",[],{"_key":527,"_type":68,"children":528,"markDefs":541,"style":76},"217b98a52154",[529,533,537],{"_key":530,"_type":72,"marks":531,"text":532},"217b98a521540",[],"Perl has a ",{"_key":534,"_type":72,"marks":535,"text":536},"217b98a521541",[308],"-c",{"_key":538,"_type":72,"marks":539,"text":540},"217b98a521542",[]," switch to just compile the code to check for basic syntax errors.",[],{"_key":543,"_type":68,"children":544,"markDefs":574,"style":76},"54590fc5cb13",[545,549,553,557,561,565,570],{"_key":546,"_type":72,"marks":547,"text":548},"54590fc5cb130",[],"You can always use the ",{"_key":550,"_type":72,"marks":551,"text":552},"54590fc5cb131",[308],"die()",{"_key":554,"_type":72,"marks":555,"text":556},"54590fc5cb132",[]," diagnostic tool, the core ",{"_key":558,"_type":72,"marks":559,"text":560},"54590fc5cb133",[308],"Data::Dumper",{"_key":562,"_type":72,"marks":563,"text":564},"54590fc5cb134",[]," to dump your data structures, or ",{"_key":566,"_type":72,"marks":567,"text":569},"54590fc5cb135",[568,308],"c989005c1b7e","Data::Printer",{"_key":571,"_type":72,"marks":572,"text":573},"54590fc5cb136",[]," to inspect complex objects.",[575],{"_key":568,"_type":116,"href":576,"reference":12},"https://metacpan.org/pod/Data::Printer",{"_key":578,"_type":68,"children":579,"markDefs":592,"style":76},"cacafee3ea94",[580,584,588],{"_key":581,"_type":72,"marks":582,"text":583},"cacafee3ea940",[],"All those allow to figure out causes in case something does not go as planned. Perl can also be run in debug mode with the ",{"_key":585,"_type":72,"marks":586,"text":587},"cacafee3ea941",[308],"-d",{"_key":589,"_type":72,"marks":590,"text":591},"cacafee3ea942",[]," switch.",[],{"_key":594,"_type":68,"children":595,"markDefs":600,"style":126},"f97b0031cb40",[596],{"_key":597,"_type":72,"marks":598,"text":599},"f97b0031cb400",[123],"Comparing Perl to other languages",[],{"_key":602,"_type":68,"children":603,"markDefs":608,"style":609},"2f38247e9929",[604],{"_key":605,"_type":72,"marks":606,"text":607},"2f38247e99290",[123],"Python",[],"h3",{"_key":611,"_type":68,"children":612,"markDefs":617,"style":76},"7ec168487647",[613],{"_key":614,"_type":72,"marks":615,"text":616},"7ec1684876470",[],"Python has a built-in interactive shell where you can easily develop code and learn. It is amazing and helps newcomers to get to the point directly without having to configure an entire environment. It can also help evaluate quick statements and prototypes or just verify some syntax.",[],{"_key":619,"_type":68,"children":620,"markDefs":651,"style":76},"307add276cc5",[621,625,630,634,639,643,648],{"_key":622,"_type":72,"marks":623,"text":624},"307add276cc50",[],"In Perl, interactive shells exists from CPAN. Such examples are ",{"_key":626,"_type":72,"marks":627,"text":629},"307add276cc51",[628],"ac3400cea7f1","Reply",{"_key":631,"_type":72,"marks":632,"text":633},"307add276cc52",[]," or ",{"_key":635,"_type":72,"marks":636,"text":638},"307add276cc53",[637,308],"a049ae00be03","Devel::REPL",{"_key":640,"_type":72,"marks":641,"text":642},"307add276cc54",[],", an effort to build a modern ",{"_key":644,"_type":72,"marks":645,"text":647},"307add276cc55",[646],"03105eb733e0","REPL",{"_key":649,"_type":72,"marks":650,"text":158},"307add276cc56",[],[652,654,656],{"_key":628,"_type":116,"href":653,"reference":12},"https://metacpan.org/release/Reply",{"_key":637,"_type":116,"href":655,"reference":12},"https://metacpan.org/pod/Devel::REPL",{"_key":646,"_type":116,"href":657,"reference":12},"https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop",{"_key":659,"_type":68,"children":660,"markDefs":682,"style":76},"84ae73cce788",[661,665,669,673,678],{"_key":662,"_type":72,"marks":663,"text":664},"84ae73cce7880",[],"A similar thing to mention from Perl world that might be similar to REPL environments and a part of its ",{"_key":666,"_type":72,"marks":667,"text":668},"84ae73cce7881",[107],"folklore",{"_key":670,"_type":72,"marks":671,"text":672},"84ae73cce7882",[]," are the ",{"_key":674,"_type":72,"marks":675,"text":677},"84ae73cce7883",[676],"62882e3ba322","Perl one liners",{"_key":679,"_type":72,"marks":680,"text":681},"84ae73cce7884",[],", which are very short programs that operate on lists, whole file lines, can generate, replace, or encode for very little effort with very little typing.",[683],{"_key":676,"_type":116,"href":684,"reference":12},"https://catonmat.net/ftp/perl1line.txt",{"_key":686,"_type":68,"children":687,"markDefs":700,"style":76},"5b9bae990e5b",[688,692,696],{"_key":689,"_type":72,"marks":690,"text":691},"5b9bae990e5b0",[],"A good reason why Python serves as an excellent learner’s programming language for that is Python isn't a TIMTOWTDI language at its core. The fact that it doesn't allow a wide variety of ways to implement something can make it more straightforward and make it easier. It is also well known for its ",{"_key":693,"_type":72,"marks":694,"text":695},"5b9bae990e5b1",[107],"\"batteries-included\"",{"_key":697,"_type":72,"marks":698,"text":699},"5b9bae990e5b2",[]," philosophy.",[],{"_key":702,"_type":68,"children":703,"markDefs":716,"style":76},"e0264ffac1ed",[704,708,713],{"_key":705,"_type":72,"marks":706,"text":707},"e0264ffac1ed0",[],"Python is an out and out object-oriented paradigm. Perl is a mix. Python offers several functional programming concepts like lambda, map, and friends, but it remains rooted in ",{"_key":709,"_type":72,"marks":710,"text":712},"e0264ffac1ed1",[711],"eeaefed1d454","OOP",{"_key":714,"_type":72,"marks":715,"text":158},"e0264ffac1ed2",[],[717],{"_key":711,"_type":116,"href":718,"reference":12},"https://stackoverflow.blog/2020/09/02/if-everyone-hates-it-why-is-oop-still-so-widely-spread/",{"_key":720,"_type":68,"children":721,"markDefs":726,"style":76},"32b667112d00",[722],{"_key":723,"_type":72,"marks":724,"text":725},"32b667112d000",[],"Perl is more invested in using traditional references and hash semantics for subroutines and other advanced usage. Python tries to do it using objects a little like how Node.js does it.",[],{"_key":728,"_type":68,"children":729,"markDefs":734,"style":76},"ba155f3c2ea0",[730],{"_key":731,"_type":72,"marks":732,"text":733},"ba155f3c2ea00",[],"Python has Jupyter notebook that takes the power of Python to the browser. Python scripts tend to be shorter than Perl in general. Python has more economic syntax, which produces excellent savings in lines of code by chaining objects.",[],{"_key":736,"_type":68,"children":737,"markDefs":742,"style":76},"d35f632a9dc2",[738],{"_key":739,"_type":72,"marks":740,"text":741},"d35f632a9dc20",[],"Sometimes it is not an apples to apples comparison as each programming language has its own benefits and specific uses.",[],{"_key":744,"_type":68,"children":745,"markDefs":750,"style":609},"af40e2ca6621",[746],{"_key":747,"_type":72,"marks":748,"text":749},"af40e2ca66210",[123],"Node.js",[],{"_key":752,"_type":68,"children":753,"markDefs":758,"style":76},"fbd15df3b6ba",[754],{"_key":755,"_type":72,"marks":756,"text":757},"fbd15df3b6ba0",[],"Node.js is object-oriented and asynchronous in its core.",[],{"_key":760,"_type":68,"children":761,"markDefs":766,"style":76},"d737fd8d070a",[762],{"_key":763,"_type":72,"marks":764,"text":765},"d737fd8d070a0",[],"Its program flow requires a good understanding of non-blocking programming. Even experienced programmers struggle with code flow and figuring out when a function returns. It can lead to callback hell, though promises and async/await make things better—if they are used. But the event loop and single threaded Node.js flow makes it harder to use for one off tasks.",[],{"_key":768,"_type":68,"children":769,"markDefs":799,"style":76},"34079779a9f8",[770,774,779,783,786,790,795],{"_key":771,"_type":72,"marks":772,"text":773},"34079779a9f80",[],"If you wish to use a third-party library to solve a particular problem, you can either do it using Node.js or Perl. The open source modules for plugging into most third-party libraries exist for both languages. Most of the time, Node.js relies on package.json and local installations of modules and Node.js. Despite Perl’s wide availability on most systems, this is something that Perl community tends to encourage with tools like ",{"_key":775,"_type":72,"marks":776,"text":778},"34079779a9f81",[777,308],"c17049681e11","perlbrew",{"_key":780,"_type":72,"marks":781,"text":782},"34079779a9f82",[],", which allows the admin-free installation of Perl and separation of the system Perl (allowing to have many versions installed). ",{"_key":784,"_type":72,"marks":785,"text":778},"34079779a9f83",[308],{"_key":787,"_type":72,"marks":788,"text":789},"34079779a9f84",[]," is very similar to nvm (the Node Version Manager). Another interesting tool is Carton, a modules dependency manager, inspired by Ruby's ",{"_key":791,"_type":72,"marks":792,"text":794},"34079779a9f85",[793],"748741c50d75","Bundler",{"_key":796,"_type":72,"marks":797,"text":798},"34079779a9f86",[]," and similar to npm, allowing you to track, install, deploy, or bundle your applications dependencies.",[800,802],{"_key":777,"_type":116,"href":801,"reference":12},"https://perlbrew.pl/",{"_key":793,"_type":116,"href":803,"reference":12},"https://bundler.io/",{"_key":805,"_type":68,"children":806,"markDefs":811,"style":609},"78e9e1ade11c",[807],{"_key":808,"_type":72,"marks":809,"text":810},"78e9e1ade11c0",[123],"ksh or Bash",[],{"_key":813,"_type":68,"children":814,"markDefs":819,"style":76},"7301705e24bb",[815],{"_key":816,"_type":72,"marks":817,"text":818},"7301705e24bb0",[],"Well, this is a funny thing to write. Perl could be a contender for shell-scripting jobs as it is a scripting language, correct? But Perl installation is a factor to consider whether to use it or some shell in a resource-constrained environment like Raspberry Pi or something.",[],{"_key":821,"_type":68,"children":822,"markDefs":827,"style":76},"c1f9f207f984",[823],{"_key":824,"_type":72,"marks":825,"text":826},"c1f9f207f9840",[],"A common opinion about shell scripts is that after more than a couple of lines, you should consider rewriting them in Perl, Python, Go, Ruby, or any high-level language you like that allows the use of libraries. This will help to handle daily task easier and avoid reinventing the wheel.",[],{"_key":829,"_type":68,"children":830,"markDefs":835,"style":126},"d9923e30e08e",[831],{"_key":832,"_type":72,"marks":833,"text":834},"d9923e30e08e0",[123],"The future of Perl",[],{"_key":837,"_type":68,"children":838,"markDefs":861,"style":76},"a89c0029fbc0",[839,843,848,852,857],{"_key":840,"_type":72,"marks":841,"text":842},"a89c0029fbc00",[],"Because it continued to evolve by taking it's inspiration from other languages, it can provide production ready implementations for event loops, promises, object-oriented programming. In the last few years, the ",{"_key":844,"_type":72,"marks":845,"text":847},"a89c0029fbc01",[846],"efd0a5bdcdbc","Corinna",{"_key":849,"_type":72,"marks":850,"text":851},"a89c0029fbc02",[]," specifications and ",{"_key":853,"_type":72,"marks":854,"text":856},"a89c0029fbc03",[855,308],"3808a97ab7c8","Object::Pad",{"_key":858,"_type":72,"marks":859,"text":860},"a89c0029fbc04",[]," implementation are preparing the introduction of modern OOP in the Perl core.",[862,864],{"_key":846,"_type":116,"href":863,"reference":12},"https://github.com/Ovid/Cor",{"_key":855,"_type":116,"href":865,"reference":12},"https://metacpan.org/pod/Object::Pad",{"_key":867,"_type":68,"children":868,"markDefs":873,"style":76},"95fef01a7708",[869],{"_key":870,"_type":72,"marks":871,"text":872},"95fef01a77080",[],"It is continuously improved by a large community and each release provide new features that take it to the next step. Notable examples being:",[],{"_key":875,"_type":68,"children":876,"level":899,"listItem":900,"markDefs":901,"style":76},"7313823583cc",[877,881,886,890,895],{"_key":878,"_type":72,"marks":879,"text":880},"7313823583cc0",[],"v5.34 provides an experimental ",{"_key":882,"_type":72,"marks":883,"text":885},"7313823583cc1",[884],"92aaf5c5d543","try / catch syntax",{"_key":887,"_type":72,"marks":888,"text":889},"7313823583cc2",[]," and the ",{"_key":891,"_type":72,"marks":892,"text":894},"7313823583cc3",[893],"3852a1a5619e","perlgov documentation",{"_key":896,"_type":72,"marks":897,"text":898},"7313823583cc4",[],", exposing goals, scope, system, and rules for Perl's new governance model.",1,"bullet",[902,904],{"_key":884,"_type":116,"href":903,"reference":12},"https://perldoc.perl.org/5.34.0/perlsyn#Try-Catch-Exception-Handling",{"_key":893,"_type":116,"href":905,"reference":12},"https://perldoc.perl.org/5.34.0/perlgov",{"_key":907,"_type":68,"children":908,"level":899,"listItem":900,"markDefs":921,"style":76},"4800c580adea",[909,913,918],{"_key":910,"_type":72,"marks":911,"text":912},"4800c580adea0",[],"v5.36 provide non-experimental ",{"_key":914,"_type":72,"marks":915,"text":917},"4800c580adea1",[916],"0a515ff0ca86","subroutines signatures",{"_key":919,"_type":72,"marks":920,"text":158},"4800c580adea2",[],[922],{"_key":916,"_type":116,"href":923,"reference":12},"https://perldoc.perl.org/5.36.0/perldelta#Core-Enhancements",{"_key":925,"_type":68,"children":926,"markDefs":940,"style":76},"dcb76b04e4bc",[927,931,936],{"_key":928,"_type":72,"marks":929,"text":930},"dcb76b04e4bc0",[],"A couple of years ago, ",{"_key":932,"_type":72,"marks":933,"text":935},"dcb76b04e4bc1",[934],"c19248bf8e41","Perl 7 was announced",{"_key":937,"_type":72,"marks":938,"text":939},"dcb76b04e4bc2",[],", which brings an end to the Raku / Perl confusion and proposes to bring the best of modern Perl practices to the front.",[941],{"_key":934,"_type":116,"href":942,"reference":12},"https://www.perl.com/article/announcing-perl-7/",{"_key":944,"_type":68,"children":945,"markDefs":950,"style":126},"a40ebb2d1e56",[946],{"_key":947,"_type":72,"marks":948,"text":949},"a40ebb2d1e560",[123],"Why it is still relevant in 2022",[],{"_key":952,"_type":68,"children":953,"markDefs":958,"style":76},"ccfb58ce2472",[954],{"_key":955,"_type":72,"marks":956,"text":957},"ccfb58ce24720",[],"Perl is not going away even if it tends to be less trendy than other modern languages.",[],{"_key":960,"_type":68,"children":961,"markDefs":966,"style":76},"f3b81c5a333c",[962],{"_key":963,"_type":72,"marks":964,"text":965},"f3b81c5a333c0",[],"It is used in production codebases of many companies, for tasks as diverse as web development, databases access, log analysis or web crawling. It is a core component of most unix-like systems.",[],{"_key":968,"_type":68,"children":969,"markDefs":974,"style":76},"3e6abdc66afc",[970],{"_key":971,"_type":72,"marks":972,"text":973},"3e6abdc66afc0",[],"Many legacy production systems rely on Perl and new Perl applications are flourishing using the modern Perl toolkits available through CPAN.",[],{"_key":976,"_type":68,"children":977,"markDefs":1016,"style":76},"a458f3ba74fc",[978,982,987,991,996,1000,1005,1008,1013],{"_key":979,"_type":72,"marks":980,"text":981},"a458f3ba74fc0",[],"If CGI was an important historic part of the Perl culture until the mid 2000, it was ",{"_key":983,"_type":72,"marks":984,"text":986},"a458f3ba74fc1",[985],"815eb52522c7","removed from Perl core with 5.22 in 2014",{"_key":988,"_type":72,"marks":989,"text":990},"a458f3ba74fc2",[],". CGI has been the recommended way to handle web development for a while; prefer instead ",{"_key":992,"_type":72,"marks":993,"text":995},"a458f3ba74fc3",[994],"eb6b930d7aeb","the alternatives",{"_key":997,"_type":72,"marks":998,"text":999},"a458f3ba74fc4",[]," provided by he community. Two notable web frameworks are ",{"_key":1001,"_type":72,"marks":1002,"text":1004},"a458f3ba74fc5",[1003],"69e3a2134f36","Dancer",{"_key":1006,"_type":72,"marks":1007,"text":395},"a458f3ba74fc6",[],{"_key":1009,"_type":72,"marks":1010,"text":1012},"a458f3ba74fc7",[1011],"a542fa497185","Mojolicious",{"_key":1014,"_type":72,"marks":1015,"text":158},"a458f3ba74fc8",[],[1017,1019,1021,1023],{"_key":985,"_type":116,"href":1018,"reference":12},"http://www.modernperlbooks.com/mt/2013/05/ejecting-cgipm-from-the-perl-core.html",{"_key":994,"_type":116,"href":1020,"reference":12},"https://metacpan.org/pod/CGI::Alternatives",{"_key":1003,"_type":116,"href":1022,"reference":12},"https://dancer.pm/",{"_key":1011,"_type":116,"href":1024,"reference":12},"https://mojolicious.org/",{"_key":1026,"_type":68,"children":1027,"markDefs":1049,"style":76},"fcad607b0efb",[1028,1032,1037,1040,1045],{"_key":1029,"_type":72,"marks":1030,"text":1031},"fcad607b0efb0",[],"In terms of bindings to other libraries and utilities, Perl is as good as other choices. For instance, communication with ",{"_key":1033,"_type":72,"marks":1034,"text":1036},"fcad607b0efb1",[1035],"52b9e782caa1","libcurl",{"_key":1038,"_type":72,"marks":1039,"text":633},"fcad607b0efb2",[],{"_key":1041,"_type":72,"marks":1042,"text":1044},"fcad607b0efb3",[1043],"21be64fde51b","libtls",{"_key":1046,"_type":72,"marks":1047,"text":1048},"fcad607b0efb4",[]," or some third-party open-source library or database can be achieved with any language we like. Here, Perl is supported out of the box and provide easy ways to get the job done.",[1050,1052],{"_key":1035,"_type":116,"href":1051,"reference":12},"https://metacpan.org/pod/WWW::Curl",{"_key":1043,"_type":116,"href":1053,"reference":12},"https://github.com/rsimoes/Net-GnuTLS",{"_key":1055,"_type":68,"children":1056,"markDefs":1061,"style":76},"1491d6c41e5f",[1057],{"_key":1058,"_type":72,"marks":1059,"text":1060},"1491d6c41e5f0",[],"Perl is perfectly capable of keeping up with modern trends. Code we write today is not the same as that which we wrote 20 years ago. Other languages have influenced the language as it became and we can expect that to continue and the ecosystem to grow.",[],{"_key":1063,"_type":68,"children":1064,"markDefs":1069,"style":126},"54bef87eb13c",[1065],{"_key":1066,"_type":72,"marks":1067,"text":1068},"54bef87eb13c0",[123],"Conclusion",[],{"_key":1071,"_type":68,"children":1072,"markDefs":1077,"style":76},"9c7ca5c59122",[1073],{"_key":1074,"_type":72,"marks":1075,"text":1076},"9c7ca5c591220",[],"Perl has always been very remarkable about its documentation and tutorials—perhaps being too wordy at times—but clearly they are developer-friendly.",[],{"_key":1079,"_type":68,"children":1080,"markDefs":1085,"style":76},"5aa4d2059814",[1081],{"_key":1082,"_type":72,"marks":1083,"text":1084},"5aa4d20598140",[],"Hopefully this article makes a case for Perl that is convincing and reasonably objective based on current trends, usage statistics, and developer base. A programmer is typically influenced by factors that differ from that of a business need or a manager. In both cases, Perl makes a case as it offers convenience, quick development times, and rich community support and tooling.",[],{"_key":1087,"_type":68,"children":1088,"markDefs":1093,"style":126},"da67f2672827",[1089],{"_key":1090,"_type":72,"marks":1091,"text":1092},"da67f26728270",[],"",[],true,"2022/07/06","While Perl might seem like an outdated scripting language, it still has plenty of relevant uses today. ",{"_type":56,"asset":1098},{"_ref":1099,"_type":59},"image-ce9ff18cf06aae61c8bb1981e8a7d2b0ad37ca62-2560x1344-jpg",{"code":1101,"language":1102},"\u003C!-- wp:paragraph -->\n\u003Cp>If you love UNIX/Linux/BSD like me, then you have definitely learnt Perl and programmed in it. I am pretty certain you have also used Perl more than once, perhaps several times. The language was created in 1987 as a general purpose UNIX scripting language, but has undergone many changes since then (even spawning another programming language, Raku).&nbsp;\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>You may have used it for occasional sys admin tasks, in your tool chain, or to enhance some shell scripts that needed more gas. But Perl is more than just scripting.&nbsp;\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>But from the amount of talk about Perl on Reddit or Stack Overflow, you might think it’s dead. It’s far from dead, and is still very relevant to software engineering today.&nbsp;\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:html -->\n\u003Csvg id=\"trend-chart\" width=\"660\" height=\"400\" title=\"Stack Overflow Trends Chart\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\u003Cg>\u003C/g>\u003Cg class=\"chart-area\" transform=\"translate(100, 20)\">\u003Cg transform=\"translate(0,300)\" fill=\"none\" font-size=\"10\" font-family=\"sans-serif\" text-anchor=\"middle\">\u003Cpath class=\"domain\" stroke=\"#000\" d=\"M0.5,6V0.5H410.5V6\">\u003C/path>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(12.420246107152282,0)\">\u003Cline stroke=\"#000\" y2=\"6\" x1=\"0.5\" x2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" y=\"9\" x=\"0.5\" dy=\"0.71em\" style=\"font-size: 12px;\">2009\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(42.042178015307464,0)\">\u003Cline stroke=\"#000\" y2=\"6\" x1=\"0.5\" x2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" y=\"9\" x=\"0.5\" dy=\"0.71em\" style=\"font-size: 12px;\">2010\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(71.66410992346266,0)\">\u003Cline stroke=\"#000\" y2=\"6\" x1=\"0.5\" x2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" y=\"9\" x=\"0.5\" dy=\"0.71em\" style=\"font-size: 12px;\">2011\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(101.28604183161785,0)\">\u003Cline stroke=\"#000\" y2=\"6\" x1=\"0.5\" x2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" y=\"9\" x=\"0.5\" dy=\"0.71em\" style=\"font-size: 12px;\">2012\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(130.9891297176036,0)\">\u003Cline stroke=\"#000\" y2=\"6\" x1=\"0.5\" x2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" y=\"9\" x=\"0.5\" dy=\"0.71em\" style=\"font-size: 12px;\">2013\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(160.6110616257588,0)\">\u003Cline stroke=\"#000\" y2=\"6\" x1=\"0.5\" x2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" y=\"9\" x=\"0.5\" dy=\"0.71em\" style=\"font-size: 12px;\">2014\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(190.23299353391397,0)\">\u003Cline stroke=\"#000\" y2=\"6\" x1=\"0.5\" x2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" y=\"9\" x=\"0.5\" dy=\"0.71em\" style=\"font-size: 12px;\">2015\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(219.85492544206915,0)\">\u003Cline stroke=\"#000\" y2=\"6\" x1=\"0.5\" x2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" y=\"9\" x=\"0.5\" dy=\"0.71em\" style=\"font-size: 12px;\">2016\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(249.5580133280549,0)\">\u003Cline stroke=\"#000\" y2=\"6\" x1=\"0.5\" x2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" y=\"9\" x=\"0.5\" dy=\"0.71em\" style=\"font-size: 12px;\">2017\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(279.1799452362101,0)\">\u003Cline stroke=\"#000\" y2=\"6\" x1=\"0.5\" x2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" y=\"9\" x=\"0.5\" dy=\"0.71em\" style=\"font-size: 12px;\">2018\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(308.8018771443653,0)\">\u003Cline stroke=\"#000\" y2=\"6\" x1=\"0.5\" x2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" y=\"9\" x=\"0.5\" dy=\"0.71em\" style=\"font-size: 12px;\">2019\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(338.4238090525204,0)\">\u003Cline stroke=\"#000\" y2=\"6\" x1=\"0.5\" x2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" y=\"9\" x=\"0.5\" dy=\"0.71em\" style=\"font-size: 12px;\">2020\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(368.1268969385062,0)\">\u003Cline stroke=\"#000\" y2=\"6\" x1=\"0.5\" x2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" y=\"9\" x=\"0.5\" dy=\"0.71em\" style=\"font-size: 12px;\">2021\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(397.7488288466614,0)\">\u003Cline stroke=\"#000\" y2=\"6\" x1=\"0.5\" x2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" y=\"9\" x=\"0.5\" dy=\"0.71em\" style=\"font-size: 12px;\">2022\u003C/text>\u003C/g>\u003C/g>\u003Cg class=\"grid-lines\" transform=\"translate(0,300)\" fill=\"none\" font-size=\"10\" font-family=\"sans-serif\" text-anchor=\"middle\">\u003Cpath class=\"domain\" stroke=\"#000\" d=\"M0.5,-300V0.5H410.5V-300\">\u003C/path>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(12.420246107152282,0)\">\u003Cline stroke=\"#000\" y2=\"-300\" x1=\"0.5\" x2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(42.042178015307464,0)\">\u003Cline stroke=\"#000\" y2=\"-300\" x1=\"0.5\" x2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(71.66410992346266,0)\">\u003Cline stroke=\"#000\" y2=\"-300\" x1=\"0.5\" x2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(101.28604183161785,0)\">\u003Cline stroke=\"#000\" y2=\"-300\" x1=\"0.5\" x2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(130.9891297176036,0)\">\u003Cline stroke=\"#000\" y2=\"-300\" x1=\"0.5\" x2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(160.6110616257588,0)\">\u003Cline stroke=\"#000\" y2=\"-300\" x1=\"0.5\" x2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(190.23299353391397,0)\">\u003Cline stroke=\"#000\" y2=\"-300\" x1=\"0.5\" x2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(219.85492544206915,0)\">\u003Cline stroke=\"#000\" y2=\"-300\" x1=\"0.5\" x2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(249.5580133280549,0)\">\u003Cline stroke=\"#000\" y2=\"-300\" x1=\"0.5\" x2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(279.1799452362101,0)\">\u003Cline stroke=\"#000\" y2=\"-300\" x1=\"0.5\" x2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(308.8018771443653,0)\">\u003Cline stroke=\"#000\" y2=\"-300\" x1=\"0.5\" x2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(338.4238090525204,0)\">\u003Cline stroke=\"#000\" y2=\"-300\" x1=\"0.5\" x2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(368.1268969385062,0)\">\u003Cline stroke=\"#000\" y2=\"-300\" x1=\"0.5\" x2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(397.7488288466614,0)\">\u003Cline stroke=\"#000\" y2=\"-300\" x1=\"0.5\" x2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003C/g>\u003Ctext x=\"205\" y=\"360\" class=\"axis-label x-axis-label\" style=\"text-anchor: middle; font-weight: bold;\">Year\u003C/text>\u003Cg fill=\"none\" font-size=\"10\" font-family=\"sans-serif\" text-anchor=\"end\">\u003Cpath class=\"domain\" stroke=\"#000\" d=\"M-6,300.5H0.5V0.5H-6\">\u003C/path>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,300)\">\u003Cline stroke=\"#000\" x2=\"-6\" y1=\"0.5\" y2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" x=\"-9\" y=\"0.5\" dy=\"0.32em\" style=\"font-size: 12px;\">0.00%\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,262.5)\">\u003Cline stroke=\"#000\" x2=\"-6\" y1=\"0.5\" y2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" x=\"-9\" y=\"0.5\" dy=\"0.32em\" style=\"font-size: 12px;\">0.50%\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,225)\">\u003Cline stroke=\"#000\" x2=\"-6\" y1=\"0.5\" y2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" x=\"-9\" y=\"0.5\" dy=\"0.32em\" style=\"font-size: 12px;\">1.00%\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,187.5)\">\u003Cline stroke=\"#000\" x2=\"-6\" y1=\"0.5\" y2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" x=\"-9\" y=\"0.5\" dy=\"0.32em\" style=\"font-size: 12px;\">1.50%\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,150)\">\u003Cline stroke=\"#000\" x2=\"-6\" y1=\"0.5\" y2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" x=\"-9\" y=\"0.5\" dy=\"0.32em\" style=\"font-size: 12px;\">2.00%\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,112.5)\">\u003Cline stroke=\"#000\" x2=\"-6\" y1=\"0.5\" y2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" x=\"-9\" y=\"0.5\" dy=\"0.32em\" style=\"font-size: 12px;\">2.50%\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,75)\">\u003Cline stroke=\"#000\" x2=\"-6\" y1=\"0.5\" y2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" x=\"-9\" y=\"0.5\" dy=\"0.32em\" style=\"font-size: 12px;\">3.00%\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,37.49999999999994)\">\u003Cline stroke=\"#000\" x2=\"-6\" y1=\"0.5\" y2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" x=\"-9\" y=\"0.5\" dy=\"0.32em\" style=\"font-size: 12px;\">3.50%\u003C/text>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,0)\">\u003Cline stroke=\"#000\" x2=\"-6\" y1=\"0.5\" y2=\"0.5\">\u003C/line>\u003Ctext fill=\"#000\" x=\"-9\" y=\"0.5\" dy=\"0.32em\" style=\"font-size: 12px;\">4.00%\u003C/text>\u003C/g>\u003C/g>\u003Cg class=\"grid-lines\" fill=\"none\" font-size=\"10\" font-family=\"sans-serif\" text-anchor=\"end\">\u003Cpath class=\"domain\" stroke=\"#000\" d=\"M410,300.5H0.5V0.5H410\">\u003C/path>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,300)\">\u003Cline stroke=\"#000\" x2=\"410\" y1=\"0.5\" y2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,262.5)\">\u003Cline stroke=\"#000\" x2=\"410\" y1=\"0.5\" y2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,225)\">\u003Cline stroke=\"#000\" x2=\"410\" y1=\"0.5\" y2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,187.5)\">\u003Cline stroke=\"#000\" x2=\"410\" y1=\"0.5\" y2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,150)\">\u003Cline stroke=\"#000\" x2=\"410\" y1=\"0.5\" y2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,112.5)\">\u003Cline stroke=\"#000\" x2=\"410\" y1=\"0.5\" y2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,75)\">\u003Cline stroke=\"#000\" x2=\"410\" y1=\"0.5\" y2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,37.49999999999994)\">\u003Cline stroke=\"#000\" x2=\"410\" y1=\"0.5\" y2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003Cg class=\"tick\" opacity=\"1\" transform=\"translate(0,0)\">\u003Cline stroke=\"#000\" x2=\"410\" y1=\"0.5\" y2=\"0.5\" style=\"stroke: #ccc; fill: none;\">\u003C/line>\u003C/g>\u003C/g>\u003Cg class=\"lines\">\u003Cpath class=\"line\" d=\"M2.5158353127474267,229.47558770347501L4.950514647664291,233.83578771885L7.466349960411718,241.96713465225L9.904410794404857,216.3381699237L12.420246107152282,229.245283018875L14.93608141989971,229.2859606761L17.208448799155452,248.85605573955002L19.720902612826603,242.734515792525L22.155581947743467,242.38683127575L24.671417260490895,234.0694682676L27.106096595407756,239.648181648075L29.621931908155183,242.34153570659998L32.13776722090261,242.86195080165L34.57244655581948,241.2271438893L37.08828186856691,236.41732283467502L39.526342702560044,247.67162104365002L42.042178015307464,249.18676388115L44.55801332805489,241.4484341253L46.83038070731063,243.273905996775L49.34283452098179,245.04277805737502L51.777513855898654,258.4108887855L54.29334916864608,244.560915219375L56.72802850356294,245.98867624665002L59.243863816310366,235.12705767015L61.75969912905779,243.24444371332498L64.19437846397467,240.9756174495L66.71021377672209,249.607698643275L69.14827461071523,245.64902942115L71.66410992346266,254.9141671383L74.17994523621009,256.160562697125L76.45231261546583,254.87373611602501L78.96476642913699,256.5795280224L81.39944576405384,256.387929740325L83.91528107680126,256.91052791572497L86.34996041171813,250.78534031415L88.86579572446556,256.9711830936L91.38163103721298,263.13590562795L93.81631037212985,258.913862492475L96.33214568487728,258.17805383025L98.77020651887042,261.006581045475L101.28604183161785,263.57244532635L103.80187714436528,262.7826213663L106.15540050145157,265.808120571375L108.66785431512271,265.05359615415L111.10253365003959,264.026496191925L113.61836896278702,257.4193845375L116.05304829770388,264.596853525525L118.56888361045131,259.3908990138L121.08471892319874,262.211599842L123.51939825811559,265.638793115025L126.03523357086301,267.603691956675L128.47329440485615,269.301796949925L130.9891297176036,268.35806606032503L133.504965030351,263.237709765225L135.77733240960674,263.080504769175L138.28978622327793,263.1373975062L140.72446555819477,259.057476539625L143.2403008709422,260.58726719325L145.67498020585907,259.269263576925L148.19081551860648,262.928664960075L150.70665083135393,268.91474277405L153.1413301662708,266.72636415105L155.65716547901823,264.9821711907L158.09522631301135,265.257145629L160.6110616257588,267.653526243675L163.1268969385062,268.20795361725L165.39926431776195,267.092546775975L167.9117181314331,268.208047773075L170.34639746634997,266.02762176285L172.86223277909738,268.719151036575L175.29691211401425,268.869799600275L177.81274742676166,268.544286696825L180.3285827395091,269.21472615165L182.76326207442597,272.163816737175L185.2790973871734,270.34858492845L187.71715822116653,272.545773213225L190.23299353391397,273.1938403383L192.74882884666138,274.632181572675L195.02119622591712,274.60388956605L197.53365003958828,277.054612937475L199.96832937450515,278.457619770225L202.48416468725256,276.737645640825L204.91884402216945,277.672363175625L207.43467933491686,277.0284591867L209.9505146476643,280.24784354595L212.38519398258117,279.784366576875L214.9010292953286,280.345090508625L217.3390901293217,279.07302550935L219.85492544206915,281.39496078765L222.37076075481656,279.943413684525L224.72428411190288,282.4191807114L227.23673792557403,281.05973291535L229.6714172604909,280.641504614175L232.18725257323834,281.94422406675L234.6219319081552,281.952340493475L237.13776722090262,280.8053162196L239.65360253365006,279.52664183985L242.0882818685669,282.5137587216L244.6041171813143,283.758099352125L247.04217801530746,284.232917439L249.5580133280549,286.037427688725L252.0738486408023,282.625582748925L254.34621602005808,284.562645859875L256.8586698337292,284.322388194675L259.2933491686461,285.594948899325L261.8091844813935,286.62261330435L264.24386381631035,286.017441697275L266.75969912905776,284.80502629245L269.27553444180523,286.129705158975L271.71021377672207,285.179184988725L274.2260490894695,288.1273110675L276.66410992346266,287.655307002675L279.1799452362101,288.42956992635L281.69578054895754,288.57031646865L283.9681479282132,287.383324961175L286.4806017418844,288.2035883472L288.91528107680125,289.060004219325L291.43111638954866,288.2596820781L293.86579572446556,288.311169960075L296.38163103721297,289.11194392575L298.89746634996044,289.1564489301L301.3321456848773,286.743428528175L303.8479809976247,287.91730972305L306.2860418316178,287.293982368725L308.8018771443653,286.4634717294L311.3177124571127,286.920958299375L313.59007983636843,289.096916299575L316.10253365003956,289.744893915L318.53721298495645,288.8459399892L321.05304829770387,286.794395451975L323.48772763262076,288.0779111025L326.0035629453682,289.3538370546L328.5193982581156,288.943052088075L330.9540775930324,289.6029556128L333.4699129057799,288.59436162525L335.907973739773,290.96213247915L338.4238090525204,291.4760986362L340.9396443652679,290.6011765935L343.2931677223542,290.3944423602L345.80562153602534,290.895044697075L348.24030087094224,291.31578093045L350.75613618368965,291.27630326745L353.1908155186065,291.974659379025L355.7066508313539,290.205414229425L358.2224861441013,291.12375411735L360.6571654790182,290.820204090375L363.1730007917656,291.5977056135L365.6110616257588,292.607223476325L368.1268969385062,292.163235304725L370.6427322512536,292.359424907925L372.91509963050936,292.28494278L375.42755344418055,292.242678566175L377.8622327790974,293.182023079725L380.3780680918448,290.8723533726L382.8127474267617,292.877975988675L385.3285827395091,293.86817618085L387.8444180522565,293.9802253065L390.2790973871734,293.00895849495L392.7949326999208,295.770179767425L395.232993533914,294.183770272125L397.7488288466614,292.989803999925L400.2646641594088,294.694389544875L402.53703153866456,294.74621727645L405.0494853523357,294.553102754025L407.4841646872526,295.061365164825L410,292.944775186725\" data-legend=\"perl\" style=\"stroke: rgb(31, 119, 180); fill: none;\">\u003C/path>\u003Cpath class=\"line\" d=\"M2.5158353127474267,265.280289330975L4.950514647664291,269.7832731315L7.466349960411718,275.47064454375L9.904410794404857,272.9514383964L12.420246107152282,271.315655277975L14.93608141989971,266.367713004525L17.208448799155452,262.93917082575L19.720902612826603,276.1690221L22.155581947743467,270.899470899525L24.671417260490895,270.786878216175L27.106096595407756,274.034682802125L29.621931908155183,273.602148877725L32.13776722090261,273.152000979075L34.57244655581948,267.90418496085L37.08828186856691,275.000000000025L39.526342702560044,275.940975192525L42.042178015307464,273.079080201975L44.55801332805489,274.52078833695L46.83038070731063,268.01921741145L49.34283452098179,268.897835933625L51.777513855898654,273.24336900885L54.29334916864608,273.432614628375L56.72802850356294,275.788027283025L59.243863816310366,272.722528819275L61.75969912905779,266.440192804425L64.19437846397467,270.07381004955L66.71021377672209,266.62187350995L69.14827461071523,267.99693349155L71.66410992346266,269.91133748355L74.17994523621009,272.441183604225L76.45231261546583,272.1322906809L78.96476642913699,270.2124529809L81.39944576405384,269.67422308965L83.91528107680126,270.285743236425L86.34996041171813,269.783096484675L88.86579572446556,267.9916141773L91.38163103721298,270.3612681249L93.81631037212985,266.40429550380003L96.33214568487728,264.251207729475L98.77020651887042,259.484533093725L101.28604183161785,261.113747142375L103.80187714436528,263.450469922575L106.15540050145157,261.14047913625L108.66785431512271,262.19487530535L111.10253365003959,261.9564811983L113.61836896278702,262.310401178475L116.05304829770388,264.384540803025L118.56888361045131,262.055538186075L121.08471892319874,258.905827279125L123.51939825811559,259.5513757899L126.03523357086301,258.842426259375L128.47329440485615,261.8361722517L130.9891297176036,259.406414552475L133.504965030351,255.008081790375L135.77733240960674,254.4804341154L138.28978622327793,258.91447407015L140.72446555819477,255.16250196262502L143.2403008709422,256.7746690983L145.67498020585907,256.58231447257504L148.19081551860648,251.78072172615L150.70665083135393,252.190510816275L153.1413301662708,251.29392936465L155.65716547901823,243.016054458975L158.09522631301135,247.521918921225L160.6110616257588,247.217884572525L163.1268969385062,243.543091436175L165.39926431776195,248.174385341025L167.9117181314331,248.59914293235L170.34639746634997,247.7610666303L172.86223277909738,245.0734205331L175.29691211401425,247.16784543345L177.81274742676166,246.62200334055L180.3285827395091,244.23286180635L182.76326207442597,243.97913665725L185.2790973871734,242.731184610225L187.71715822116653,249.311542416675L190.23299353391397,244.16140639957501L192.74882884666138,241.33131745335L195.02119622591712,242.173175772375L197.53365003958828,244.04825026515L199.96832937450515,249.029915456325L202.48416468725256,244.79710727205L204.91884402216945,250.59334342845L207.43467933491686,250.97740022085L209.9505146476643,251.8727026614L212.38519398258117,246.72633677062498L214.9010292953286,247.092711304425L217.3390901293217,248.1203665869L219.85492544206915,248.1478391457L222.37076075481656,244.04212417972502L224.72428411190288,246.50782702575L227.23673792557403,240.7204216803L229.6714172604909,243.521090781375L232.18725257323834,245.21713438425L234.6219319081552,244.44571161382498L237.13776722090262,241.624844555025L239.65360253365006,243.1687816587L242.0882818685669,244.950721901175L244.6041171813143,244.5356371491L247.04217801530746,245.3283409422L249.5580133280549,247.61893884457498L252.0738486408023,243.9437333964L254.34621602005808,240.20372800215L256.8586698337292,239.6623805112L259.2933491686461,241.8928642923L261.8091844813935,240.502480125075L264.24386381631035,243.77495381265L266.75969912905776,244.683466502775L269.27553444180523,244.518820635825L271.71021377672207,236.66660732407502L274.2260490894695,242.07023852909998L276.66410992346266,242.9643931134L279.1799452362101,240.872741011275L281.69578054895754,241.41668700809998L283.9681479282132,245.3277414984L286.4806017418844,245.773807303575L288.91528107680125,250.498779422025L291.43111638954866,248.961546774675L293.86579572446556,250.7263546689L296.38163103721297,251.55534522015L298.89746634996044,245.4137744682L301.3321456848773,247.636542686175L303.8479809976247,246.18633742185L306.2860418316178,249.63587581455L308.8018771443653,247.227895426125L311.3177124571127,247.164823605975L313.59007983636843,247.891755821325L316.10253365003956,245.70243348225L318.53721298495645,245.485787784825L321.05304829770387,247.68118537095L323.48772763262076,247.23092298097498L326.0035629453682,246.99098033422501L328.5193982581156,248.9380144167L330.9540775930324,243.239102172975L333.4699129057799,248.29102961040002L335.907973739773,249.834115089825L338.4238090525204,249.838131974175L340.9396443652679,245.330177185275L343.2931677223542,243.67650293025L345.80562153602534,246.90155611965L348.24030087094224,250.97880076619998L350.75613618368965,251.006309259525L353.1908155186065,254.62946637570002L355.7066508313539,254.3429465379L358.2224861441013,252.14313213847498L360.6571654790182,247.216173519525L363.1730007917656,247.233591252675L365.6110616257588,256.715575620825L368.1268969385062,258.70835705385L370.6427322512536,252.7777990548L372.91509963050936,251.4763506426L375.42755344418055,250.7964183339L377.8622327790974,254.3589974757L380.3780680918448,249.212837996025L382.8127474267617,259.4553347352L385.3285827395091,258.22045465575L387.8444180522565,259.832653815075L390.2790973871734,254.5849135815L392.7949326999208,248.9777934438L395.232993533914,251.154963935625L397.7488288466614,249.1627007628L400.2646641594088,247.16268350849998L402.53703153866456,250.714514450475L405.0494853523357,246.178183648575L407.4841646872526,252.925353059925L410,251.69884550872501\" data-legend=\"bash\" style=\"stroke: rgb(255, 127, 14); fill: none;\">\u003C/path>\u003Cpath class=\"line\" d=\"M2.5158353127474267,300L4.950514647664291,300L7.466349960411718,300L9.904410794404857,300L12.420246107152282,300L14.93608141989971,300L17.208448799155452,300L19.720902612826603,300L22.155581947743467,300L24.671417260490895,300L27.106096595407756,300L29.621931908155183,300L32.13776722090261,300L34.57244655581948,300L37.08828186856691,299.2125984252L39.526342702560044,298.797048759675L42.042178015307464,299.66348850255L44.55801332805489,299.156317494675L46.83038070731063,298.697615188725L49.34283452098179,297.886260694575L51.777513855898654,297.23708701725L54.29334916864608,297.966781731825L56.72802850356294,294.5367856434L59.243863816310366,295.256091968625L61.75969912905779,291.239903268825L64.19437846397467,289.945746459375L66.71021377672209,290.463392431425L69.14827461071523,288.28362310875L71.66410992346266,287.6438407848L74.17994523621009,285.35653650255L76.45231261546583,282.51730836285L78.96476642913699,272.182528841925L81.39944576405384,274.77856177755L83.91528107680126,273.553551525L86.34996041171813,273.2984293194L88.86579572446556,267.219482063175L91.38163103721298,261.3664290981L93.81631037212985,271.892335531875L96.33214568487728,267.7708764666L98.77020651887042,256.51291566405L101.28604183161785,255.614027520225L103.80187714436528,262.418340335625L106.15540050145157,258.6098301654L108.66785431512271,252.33520543897498L111.10253365003959,252.725333253825L113.61836896278702,252.298202407575L116.05304829770388,251.9642465376L118.56888361045131,245.48148253425L121.08471892319874,253.0352311761L123.51939825811559,249.9926213124L126.03523357086301,248.705845598025L128.47329440485615,245.12208710640002L130.9891297176036,241.981809478275L133.504965030351,242.98395468945L135.77733240960674,238.01868271245002L138.28978622327793,244.750085045025L140.72446555819477,236.548146716775L143.2403008709422,238.9984304805L145.67498020585907,232.527722490825L148.19081551860648,225.990043530075L150.70665083135393,230.603526631575L153.1413301662708,231.2072682141L155.65716547901823,222.414822650325L158.09522631301135,213.961412997375L160.6110616257588,212.2820994933L163.1268969385062,210.389672790225L165.39926431776195,209.1058450596L167.9117181314331,215.492195114475L170.34639746634997,199.7046622395L172.86223277909738,198.15214708792502L175.29691211401425,198.62511820702503L177.81274742676166,190.664914521525L180.3285827395091,198.576351106275L182.76326207442597,197.80330839645L185.2790973871734,195.09003905309999L187.71715822116653,192.17182659539998L190.23299353391397,187.4141294208L192.74882884666138,184.81396933155L195.02119622591712,191.182237295325L197.53365003958828,184.756097561025L199.96832937450515,175.989052677225L202.48416468725256,167.617517075175L204.91884402216945,166.265953830525L207.43467933491686,158.7583160862L209.9505146476643,163.64640383325002L212.38519398258117,166.228413700725L214.9010292953286,159.53517268649998L217.3390901293217,154.036541941575L219.85492544206915,140.814283330575L222.37076075481656,152.0626193367L224.72428411190288,147.43297546935L227.23673792557403,147.747913881375L229.6714172604909,141.3002522592L232.18725257323834,137.12869391085L234.6219319081552,133.85033842927498L237.13776722090262,127.914038905725L239.65360253365006,137.536843220025L242.0882818685669,135.2407488429L244.6041171813143,136.67386609072503L247.04217801530746,131.13361280775L249.5580133280549,121.398998349675L252.0738486408023,128.632924376625L254.34621602005808,126.73354100107503L256.8586698337292,126.44460012210001L259.2933491686461,125.800325703L261.8091844813935,113.31113678062496L264.24386381631035,106.602687571275L266.75969912905776,109.4652735096L269.27553444180523,109.551978579675L271.71021377672207,114.49502412277502L274.2260490894695,109.05131988465001L276.66410992346266,100.401419552925L279.1799452362101,88.4736477552L281.69578054895754,99.65892372960002L283.9681479282132,107.63951355712499L286.4806017418844,112.32981461452499L288.91528107680125,107.91718151955001L291.43111638954866,100.46371799662501L293.86579572446556,101.812560582375L296.38163103721297,97.25192499555001L298.89746634996044,93.70933668352498L301.3321456848773,98.21604423907499L303.8479809976247,100.686378035925L306.2860418316178,92.73668072062503L308.8018771443653,91.50693110962499L311.3177124571127,97.897665148875L313.59007983636843,97.70295783517503L316.10253365003956,90.93455227627499L318.53721298495645,88.42456438874999L321.05304829770387,83.56237969477499L323.48772763262076,87.51517509210001L326.0035629453682,84.526097885625L328.5193982581156,92.08492921335L330.9540775930324,99.17287946730002L333.4699129057799,89.12355596782501L335.907973739773,88.124928497925L338.4238090525204,73.93580382975L340.9396443652679,90.928394889825L343.2931677223542,77.42273509365L345.80562153602534,73.12106831482501L348.24030087094224,60.98107327215004L350.75613618368965,65.56166508059997L353.1908155186065,52.17200980064999L355.7066508313539,40.29043667535001L358.2224861441013,48.524190443625L360.6571654790182,64.20733529745002L363.1730007917656,72.74594449259999L365.6110616257588,51.918735891675L368.1268969385062,51.2773025676L370.6427322512536,61.47618208702502L372.91509963050936,59.15824665180003L375.42755344418055,60.132539377650005L377.8622327790974,37.536062026725006L380.3780680918448,54.25566772252503L382.8127474267617,41.31791358615004L385.3285827395091,45.84109915544997L387.8444180522565,46.21056070919997L390.2790973871734,61.50408789149998L392.7949326999208,65.0334860769L395.232993533914,41.26247948324999L397.7488288466614,45.064322561775015L400.2646641594088,52.0037339829L402.53703153866456,62.62909294694998L405.0494853523357,54.88962393045003L407.4841646872526,52.280178211199996L410,61.553136203700035\" data-legend=\"node.js\" style=\"stroke: rgb(44, 160, 44); fill: none;\">\u003C/path>\u003C/g>\u003C/g>\u003Cg transform=\"translate(20, 150)\">\u003Ctext transform=\"rotate(-90)\" x=\"-50\" y=\"0\" dy=\"1em\" class=\"axis-label y-axis-label\" style=\"text-anchor: middle; font-weight: bold;\">% of Stack Overflow questions that month\u003C/text>\u003C/g>\u003Cg class=\"legend\" transform=\"translate(530, 30)\" style=\"font-size: 12px;\">\u003Ctext class=\"legend-title\" style=\"font-weight: bold;\">Tag\u003C/text>\u003Cg class=\"legend-items\" transform=\"translate(0,20)\">\u003Ctext y=\"0em\" x=\"1em\">node.js\u003C/text>\u003Ctext y=\"1em\" x=\"1em\">perl\u003C/text>\u003Ctext y=\"2em\" x=\"1em\">bash\u003C/text>\u003Ccircle cy=\"-0.25em\" cx=\"0\" r=\"0.4em\" style=\"fill: rgb(44, 160, 44);\">\u003C/circle>\u003Ccircle cy=\"0.75em\" cx=\"0\" r=\"0.4em\" style=\"fill: rgb(31, 119, 180);\">\u003C/circle>\u003Ccircle cy=\"1.75em\" cx=\"0\" r=\"0.4em\" style=\"fill: rgb(255, 127, 14);\">\u003C/circle>\u003C/g>\u003Crect class=\"legend-box\">\u003C/rect>\u003C/g>\u003C/svg>\n\u003C!-- /wp:html -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>\u003Cem>From \u003Ca href=\"https://insights.stackoverflow.com/trends?tags=perl%2Cbash%2Cnode.js\">https://insights.stackoverflow.com/trends?tags=perl%2Cbash%2Cnode.js\u003C/a>\u003C/em>\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2 id=\"h-what-makes-it-special\">\u003Cstrong>What makes it special?\u003C/strong>\u003C/h2>\n\u003C!-- /wp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Perl is a high-level, interpreted language. It is open source and free to contribute to.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Perl’s primary strength is in text processing. Be it a regex-based approach or otherwise, Perl is excellent for logfile analysis, text manipulation, in-place editing of files, and scouring structured text files for specific field values.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Perl is very Unix-friendly. It can serve as a wrapper around Unix tools and is fully integrated into OS semantics. As a result, it excels at pipes, file slurping, inter-process communication, and other geeky tasks. It can create Unix daemons or server processes that run in the background. We can easily invoke a Perl daemon to avoid spending hours working on C and reduce \u003Ca href=\"https://portswigger.net/daily-swig/c-is-least-secure-programming-language-study-claims#:~:text=The%20top%20vulnerabilities%20found%20in,programming%20language%20in%20the%20list.\">security flaws\u003C/a>.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Like \u003Ca href=\"https://www.npmjs.com/\">npm\u003C/a> for Node.js, Perl has a vibrant development community in \u003Ca href=\"https://metacpan.org/\">CPAN\u003C/a>, with a vast archive of Perl modules. You can find a module to do anything you want. Most modules are written in pure Perl, though some performance intensive modules have an XS component that uses C for performance.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Through CPAN, you can wrap many databases—SQLite, MySQL, Postgres, and more—in Perl code using database driver (DBD) modules. These export the DB operations using Perl’s own semantics into unified portable Perl code that hides the complexities of the database.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Perl supports arrays, hashes, and references using which you can code in very powerful ways without thinking deeply about data structures or algorithms. Most CPAN modules give you both a procedural style as well as the object oriented one. By giving you that choice, you can pretty much do your task your own way.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>\u003Cstrong>What sort of problems make Perl a natural?\u003C/strong>\u003C/h2>\n\u003C!-- /wp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>As stated above, Perl does very well with text processing. It can scour CSV files for data fields based on complex regex statements. It is a tool of choice for parsing log files. It can quickly edit settings files. Perl is also a natural for various format conversions, generating PDFs, HTML, or XML.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Since the early days of the internet, Perl served as the foundation of a lot of basic networking tasks: common gateway interface (CGI), MIME decoding in emails, or managing websockets between a client and server. It has evolved a lot since these early times, becoming a source of inspiration for other ecosystems and getting inspiration from other languages to evolve.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>For power Unix users, Perl allows you to automate nearly any action that you like. You can create daemons—small, constantly running programs—that will automatically take actions when their conditions are met.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Testing is at the core of Perl culture. Excellent \u003Ca href=\"http://www.modernperlbooks.com/mt/2009/04/a-test-infected-culture.html\">test toolkits and infrastructures\u003C/a> lay at the foundation of the community favorites methodologies. Any module uploaded to the CPAN will pass automatically through the *\u003Ca href=\"http://www.cpantesters.org/page/about.html\">CPAN Testers Reports\u003C/a>, a multi-platform testing ground that has operated since 1998. Standard Perl tests can also be run in common \u003Ca href=\"https://stackoverflow.com/questions/533553/perl-build-unit-testing-code-coverage-a-complete-working-example\">build pipelines\u003C/a> and CI/CD.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>\u003Cstrong>A flexible and fun way to code\u003C/strong>\u003C/h2>\n\u003C!-- /wp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>In today’s event-loop-centric asynchronous world of JavaScript, Node.js, and TypeScript, Perl developed ways to face the challenges of non-blocking programming.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Despite asynchronicity not being a fundamental part of Perl's core, it is as always possible to extend the language through CPAN modules. A robust example is \u003Ca href=\"https://metacpan.org/pod/Future::AsyncAwait\">\u003Ccode>Future::AsyncAwait\u003C/code>\u003C/a> that \u003Cem>provides syntax for deferring and resuming subroutines\u003C/em> with the async and await keywords. An alternative is \u003Ca href=\"https://metacpan.org/pod/Mojo::Promise\">\u003Ccode>Mojo::Promise\u003C/code>\u003C/a>, a Perl-ish implementation of \u003Ca href=\"https://promisesaplus.com/\">Promises/A+\u003C/a> and a superset of \u003Ca href=\"https://duckduckgo.com/?q=%5Cmdn%20Promise\">ES6 Promises\u003C/a>.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Perl includes a number of specialized operators that process data in unique ways. You can use the diamond \u003Ccode>&lt;>\u003C/code> operator to eat up any stream, file, socket, pipe, named pipe, whatever.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>The regex operator \u003Ccode>=~\u003C/code> opens the door to the rich world of Perl regular expressions, that can reduce many lines of complex code to a couple of \u003Ccode>match\u003C/code> and \u003Ccode>replace\u003C/code> operations.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Perl emphasizes the \u003Cem>get what you want the way you want\u003C/em> philosophy, also known as \u003Ca href=\"https://en.wikipedia.org/wiki/There%27s_more_than_one_way_to_do_it\">TMTOWTDI\u003C/a>.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Perl is multi-paradigm. In addition to procedural or object-oriented, it allows functional programming. Depending of the situation, it allows to choose the most accurate programming paradigm. Providing a low level object-oriented system, robust object toolkits like \u003Ca href=\"https://metacpan.org/pod/Moose\">Moose\u003C/a> can be used for production code (from CPAN, not a core module). Such toolkits greatly simplify the object-oriented paradigm for Perl.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>\u003Cstrong>Looking at some code\u003C/strong>\u003C/h2>\n\u003C!-- /wp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Let us examine some code samples to get some perspective by creating a sha256 digest of a string.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>This is how you do in Node.js:\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>const {\n  createHash\n} = require('node:crypto');\n\nconst hash = createHash('sha256');\ndata = 'Stack Overflow is cool';\nhash.update(data);\nconsole.log(hash.copy().digest('hex'));\n\u003C/code>\u003C/pre>\n\u003C!-- /wp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Let's examine two ways (\u003Cem>more ways\u003C/em> could be possible) to do this in Perl. One is the procedural approach:\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>use Digest::SHA qw(sha256_hex);\n\nmy $data = 'Stack Overflow is cool';\nmy $hexdigest = sha256_hex($data);\nprint(\"Procedural interface :: \" . $hexdigest . \"\\n\");\n\u003C/code>\u003C/pre>\n\u003C!-- /wp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Another is the object-oriented approach:\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>use Digest::SHA\n\nmy $sha = Digest::SHA->new('sha256');\n$sha->add($data);               # feed data into stream\nmy $hexdigest = $sha->hexdigest;\n\nprint(\"OO interface ::\" . $hexdigest);\n\u003C/code>\u003C/pre>\n\u003C!-- /wp:code -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Here’s how you do it in Python:\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:code -->\n\u003Cpre class=\"wp-block-code\">\u003Ccode>import hashlib\nm = hashlib.sha256()\nm.update(b\"Stack Overflow is cool\")\n\nprint(m.hexdigest())\n\u003C/code>\u003C/pre>\n\u003C!-- /wp:code -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>\u003Cstrong>Debugging\u003C/strong>\u003C/h2>\n\u003C!-- /wp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Perl has a \u003Ccode>-c\u003C/code> switch to just compile the code to check for basic syntax errors.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>You can always use the \u003Ccode>die()\u003C/code> diagnostic tool, the core \u003Ccode>Data::Dumper\u003C/code> to dump your data structures, or \u003Ca href=\"https://metacpan.org/pod/Data::Printer\">\u003Ccode>Data::Printer\u003C/code>\u003C/a> to inspect complex objects.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>All those allow to figure out causes in case something does not go as planned. Perl can also be run in debug mode with the \u003Ccode>-d\u003C/code> switch.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>\u003Cstrong>Comparing Perl to other languages\u003C/strong>\u003C/h2>\n\u003C!-- /wp:heading -->\n\n\u003C!-- wp:heading {\"level\":3} -->\n\u003Ch3>\u003Cstrong>Python\u003C/strong>\u003C/h3>\n\u003C!-- /wp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Python has a built-in interactive shell where you can easily develop code and learn. It is amazing and helps newcomers to get to the point directly without having to configure an entire environment. It can also help evaluate quick statements and prototypes or just verify some syntax.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>In Perl, interactive shells exists from CPAN. Such examples are \u003Ca href=\"https://metacpan.org/release/Reply\">Reply\u003C/a> or \u003Ca href=\"https://metacpan.org/pod/Devel::REPL\">\u003Ccode>Devel::REPL\u003C/code>\u003C/a>, an effort to build a modern \u003Ca href=\"https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop\">REPL\u003C/a>.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>A similar thing to mention from Perl world that might be similar to REPL environments and a part of its \u003Cem>folklore\u003C/em> are the \u003Ca href=\"https://catonmat.net/ftp/perl1line.txt\">Perl one liners\u003C/a>, which are very short programs that operate on lists, whole file lines, can generate, replace, or encode for very little effort with very little typing.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>A good reason why Python serves as an excellent learner’s programming language for that is Python isn't a TIMTOWTDI language at its core. The fact that it doesn't allow a wide variety of ways to implement something can make it more straightforward and make it easier. It is also well known for its \u003Cem>\"batteries-included\"\u003C/em> philosophy.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Python is an out and out object-oriented paradigm. Perl is a mix. Python offers several functional programming concepts like lambda, map, and friends, but it remains rooted in \u003Ca href=\"https://stackoverflow.blog/2020/09/02/if-everyone-hates-it-why-is-oop-still-so-widely-spread/\">OOP\u003C/a>.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Perl is more invested in using traditional references and hash semantics for subroutines and other advanced usage. Python tries to do it using objects a little like how Node.js does it.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Python has Jupyter notebook that takes the power of Python to the browser. Python scripts tend to be shorter than Perl in general. Python has more economic syntax, which produces excellent savings in lines of code by chaining objects.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Sometimes it is not an apples to apples comparison as each programming language has its own benefits and specific uses.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:heading {\"level\":3} -->\n\u003Ch3>\u003Cstrong>Node.js\u003C/strong>\u003C/h3>\n\u003C!-- /wp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Node.js is object-oriented and asynchronous in its core.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Its program flow requires a good understanding of non-blocking programming. Even experienced programmers struggle with code flow and figuring out when a function returns. It can lead to callback hell, though promises and async/await make things better—if they are used. But the event loop and single threaded Node.js flow makes it harder to use for one off tasks.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>If you wish to use a third-party library to solve a particular problem, you can either do it using Node.js or Perl. The open source modules for plugging into most third-party libraries exist for both languages. Most of the time, Node.js relies on package.json and local installations of modules and Node.js. Despite Perl’s wide availability on most systems, this is something that Perl community tends to encourage with tools like \u003Ca href=\"https://perlbrew.pl/\">\u003Ccode>perlbrew\u003C/code>\u003C/a>, which allows the admin-free installation of Perl and separation of the system Perl (allowing to have many versions installed). \u003Ccode>perlbrew\u003C/code> is very similar to nvm (the Node Version Manager). Another interesting tool is Carton, a modules dependency manager, inspired by Ruby's \u003Ca href=\"https://bundler.io/\">Bundler\u003C/a> and similar to npm, allowing you to track, install, deploy, or bundle your applications dependencies.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:heading {\"level\":3} -->\n\u003Ch3>\u003Cstrong>ksh or Bash\u003C/strong>\u003C/h3>\n\u003C!-- /wp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Well, this is a funny thing to write. Perl could be a contender for shell-scripting jobs as it is a scripting language, correct? But Perl installation is a factor to consider whether to use it or some shell in a resource-constrained environment like Raspberry Pi or something.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>A common opinion about shell scripts is that after more than a couple of lines, you should consider rewriting them in Perl, Python, Go, Ruby, or any high-level language you like that allows the use of libraries. This will help to handle daily task easier and avoid reinventing the wheel.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>\u003Cstrong>The future of Perl\u003C/strong>\u003C/h2>\n\u003C!-- /wp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Because it continued to evolve by taking it's inspiration from other languages, it can provide production ready implementations for event loops, promises, object-oriented programming. In the last few years, the \u003Ca href=\"https://github.com/Ovid/Cor\">Corinna\u003C/a> specifications and \u003Ca href=\"https://metacpan.org/pod/Object::Pad\">\u003Ccode>Object::Pad\u003C/code>\u003C/a> implementation are preparing the introduction of modern OOP in the Perl core.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>It is continuously improved by a large community and each release provide new features that take it to the next step. Notable examples being:\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:list -->\n\u003Cul>\u003Cli>v5.34 provides an experimental \u003Ca href=\"https://perldoc.perl.org/5.34.0/perlsyn#Try-Catch-Exception-Handling\">try / catch syntax\u003C/a> and the \u003Ca href=\"https://perldoc.perl.org/5.34.0/perlgov\">perlgov documentation\u003C/a>, exposing goals, scope, system, and rules for Perl's new governance model.\u003C/li>\u003Cli>v5.36 provide non-experimental \u003Ca href=\"https://perldoc.perl.org/5.36.0/perldelta#Core-Enhancements\">subroutines signatures\u003C/a>.\u003C/li>\u003C/ul>\n\u003C!-- /wp:list -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>A couple of years ago, \u003Ca href=\"https://www.perl.com/article/announcing-perl-7/\">Perl 7 was announced\u003C/a>, which brings an end to the Raku / Perl confusion and proposes to bring the best of modern Perl practices to the front.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>\u003Cstrong>Why it is still relevant in 2022\u003C/strong>\u003C/h2>\n\u003C!-- /wp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Perl is not going away even if it tends to be less trendy than other modern languages.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>It is used in production codebases of many companies, for tasks as diverse as web development, databases access, log analysis or web crawling. It is a core component of most unix-like systems.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Many legacy production systems rely on Perl and new Perl applications are flourishing using the modern Perl toolkits available through CPAN.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>If CGI was an important historic part of the Perl culture until the mid 2000, it was \u003Ca href=\"http://www.modernperlbooks.com/mt/2013/05/ejecting-cgipm-from-the-perl-core.html\">removed from Perl core with 5.22 in 2014\u003C/a>. CGI has been the recommended way to handle web development for a while; prefer instead \u003Ca href=\"https://metacpan.org/pod/CGI::Alternatives\">the alternatives\u003C/a> provided by he community. Two notable web frameworks are \u003Ca href=\"https://dancer.pm/\">Dancer\u003C/a> and \u003Ca href=\"https://mojolicious.org/\">Mojolicious\u003C/a>.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>In terms of bindings to other libraries and utilities, Perl is as good as other choices. For instance, communication with \u003Ca href=\"https://metacpan.org/pod/WWW::Curl\">libcurl\u003C/a> or \u003Ca href=\"https://github.com/rsimoes/Net-GnuTLS\">libtls\u003C/a> or some third-party open-source library or database can be achieved with any language we like. Here, Perl is supported out of the box and provide easy ways to get the job done.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Perl is perfectly capable of keeping up with modern trends. Code we write today is not the same as that which we wrote 20 years ago. Other languages have influenced the language as it became and we can expect that to continue and the ecosystem to grow.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2>\u003Cstrong>Conclusion\u003C/strong>\u003C/h2>\n\u003C!-- /wp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Perl has always been very remarkable about its documentation and tutorials—perhaps being too wordy at times—but clearly they are developer-friendly.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Hopefully this article makes a case for Perl that is convincing and reasonably objective based on current trends, usage statistics, and developer base. A programmer is typically influenced by factors that differ from that of a business need or a manager. In both cases, Perl makes a case as it offers convenience, quick development times, and rich community support and tooling.\u003C/p>\n\u003C!-- /wp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2 id=\"h-\">\u003C/h2>\n\u003C!-- /wp:heading -->","html","2022-07-06T14:30:31.000Z",{"current":1105},"why-perl-is-still-relevant-in-2022",[1107,1115,1119],{"_createdAt":1108,"_id":1109,"_rev":1110,"_type":1111,"_updatedAt":1108,"slug":1112,"title":1114},"2023-05-23T16:43:21Z","wp-tagcat-code-for-a-living","9HpbCsT2tq0xwozQfkc4ih","blogTag",{"current":1113},"code-for-a-living","Code for a Living",{"_createdAt":1108,"_id":1116,"_rev":1110,"_type":1111,"_updatedAt":1108,"slug":1117,"title":1118},"wp-tagcat-perl",{"current":1118},"perl",{"_createdAt":1108,"_id":1120,"_rev":1110,"_type":1111,"_updatedAt":1108,"slug":1121,"title":1122},"wp-tagcat-unix",{"current":1122},"unix","Why Perl is still relevant in 2022",[1125,1131,1137,1143],{"_id":1126,"publishedAt":1127,"slug":1128,"sponsored":12,"title":1130},"28e560af-f0aa-4d46-bd90-f435ad604aa7","2026-06-26T14:00:27.102Z",{"_type":10,"current":1129},"paging-charity-how-can-engineering-leaders-avoid-becoming-bond-villains","Paging Charity! How can engineering leaders avoid becoming Bond villains?",{"_id":1132,"publishedAt":1133,"slug":1134,"sponsored":12,"title":1136},"4b22c2a3-3779-4966-93eb-5230391dbdce","2026-06-23T14:08:58.595Z",{"_type":10,"current":1135},"your-ai-shipped-a-backend-that-boots-that-is-the-whole-problem","Your AI shipped a backend that boots. That is the whole problem.",{"_id":1138,"publishedAt":1139,"slug":1140,"sponsored":12,"title":1142},"5cf362e1-fe7b-45af-b69c-914731c6a052","2026-06-23T14:00:00.000Z",{"_type":10,"current":1141},"the-2026-developer-survey-is-now-open-for-human-developers-only","The 2026 Developer Survey is now open (for human developers only)!",{"_id":1144,"publishedAt":1145,"slug":1146,"sponsored":12,"title":1148},"30b995f7-7cb9-4dd8-bf71-d0685940a32b","2026-06-19T14:00:00.000Z",{"_type":10,"current":1147},"dispatches-from-o-reilly-from-capabilities-to-responsibilities","Dispatches from O'Reilly: From capabilities to responsibilities",{"data":1150,"sourceMap":-1},{"count":1151,"lastTimestamp":1152},91,"2025-03-21T15:37:08Z"]