├── .github ├── FUNDING.yml ├── dependabot.yml └── workflows │ └── regenerate.yml ├── README.md ├── bin └── mkjson ├── cpanfile ├── docs ├── index.html └── tutorials.json └── tutorials.csv /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: davorg 2 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # Set update schedule for GitHub Actions 2 | 3 | version: 2 4 | updates: 5 | 6 | - package-ecosystem: "github-actions" 7 | directory: "/" 8 | schedule: 9 | # Check for updates to GitHub Actions every week 10 | interval: "weekly" 11 | -------------------------------------------------------------------------------- /.github/workflows/regenerate.yml: -------------------------------------------------------------------------------- 1 | name: Generate web page 2 | 3 | on: 4 | push: 5 | branches: 'main' 6 | paths: 'tutorials.csv' 7 | workflow_dispatch: 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | container: 14 | image: perldocker/perl-tester:5.34 # https://hub.docker.com/r/perldocker/perl-tester 15 | 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v4 19 | 20 | - name: Install modules 21 | run: | 22 | cpanm --installdeps --notest . 23 | 24 | - name: Create pages 25 | run: | 26 | perl bin/mkjson 27 | 28 | - name: Commit new page 29 | if: github.repository == 'davorg/learncpan' 30 | run: | 31 | git config --global --add safe.directory /__w/learncpan/learncpan 32 | GIT_STATUS=$(git status --porcelain) 33 | echo $GIT_STATUS 34 | git config user.name github-actions[bot] 35 | git config user.email 41898282+github-actions[bot]@users.noreply.github.com 36 | git add docs/ 37 | if [ "$GIT_STATUS" != "" ]; then git commit -m "Automated Web page generation"; fi 38 | if [ "$GIT_STATUS" != "" ]; then git push; fi 39 | 40 | - name: Update pages artifact 41 | uses: actions/upload-pages-artifact@v3 42 | with: 43 | path: docs/ 44 | 45 | deploy: 46 | needs: build 47 | permissions: 48 | pages: write 49 | id-token: write 50 | environment: 51 | name: github-pages 52 | url: ${{ steps.deployment.outputs.page_url }} 53 | runs-on: ubuntu-latest 54 | steps: 55 | - name: Deploy to GitHub Pages 56 | id: deployment 57 | uses: actions/deploy-pages@v4 58 | 59 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LearnCPAN 2 | 3 | A simple API that returns a list of good quality tutorials for CPAN modules. 4 | 5 | ## Adding tutorials 6 | 7 | We want people to add tutorials to this list. The way to do that is to edit 8 | the `tutorials.csv` file and create a pull request. 9 | 10 | ## Output 11 | 12 | The JSON that this project generates is at: 13 | 14 | * [davorg.dev/learncpan/tutorials.json](https://davorg.dev/learncpan/tutorials.json) 15 | -------------------------------------------------------------------------------- /bin/mkjson: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use 5.34.0; 4 | use warnings; 5 | 6 | use JSON; 7 | 8 | my $out = 'docs/tutorials.json'; 9 | 10 | open my $csv, '<', 'tutorials.csv' or die $!; 11 | 12 | <$csv>; # Skip header 13 | 14 | my $data; 15 | while (<$csv>) { 16 | chomp; 17 | my ($module, $url, $title) = split /,/, $_, 3; 18 | 19 | push @{ $data->{$module} }, { 20 | url => $url, 21 | title => $title, 22 | }; 23 | } 24 | 25 | my $json = JSON->new->canonical(1)->pretty(1)->encode($data); 26 | 27 | open my $json_fh, '>', $out; 28 | 29 | print $json_fh $json; 30 | 31 | -------------------------------------------------------------------------------- /cpanfile: -------------------------------------------------------------------------------- 1 | requires 'JSON'; 2 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Learn CPAN 5 | 6 | 7 | 8 |

Learn CPAN

9 | 10 |

The important thing here is tutorials.json 11 | which contains links to tutorials about CPAN modules.

12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /docs/tutorials.json: -------------------------------------------------------------------------------- 1 | { 2 | "AWS-Lambda" : [ 3 | { 4 | "title" : "Taking the Sleigh to a CloudFront", 5 | "url" : "https://perladvent.org/2019/2019-12-17.html" 6 | } 7 | ], 8 | "AWS-Lambda-PSGI" : [ 9 | { 10 | "title" : "Taking the Sleigh to a CloudFront", 11 | "url" : "https://perladvent.org/2019/2019-12-17.html" 12 | } 13 | ], 14 | "AWS-Lambda-Quick" : [ 15 | { 16 | "title" : "Suddenly Serverless", 17 | "url" : "https://perladvent.org/2019/2019-12-15.html" 18 | } 19 | ], 20 | "Acme-Code-FreedomFighter" : [ 21 | { 22 | "title" : "Acme::Code::FreedomFighter", 23 | "url" : "https://perladvent.org/2003/19th/" 24 | } 25 | ], 26 | "Acme-Curses-Marquee" : [ 27 | { 28 | "title" : "Here we come a wascrolling", 29 | "url" : "https://perladvent.org/2007/18/" 30 | } 31 | ], 32 | "Acme-Don-t" : [ 33 | { 34 | "title" : "Christmas don't be late", 35 | "url" : "https://perladvent.org/2006/7/" 36 | } 37 | ], 38 | "Acme-Drunk" : [ 39 | { 40 | "title" : "Acme::Drunk", 41 | "url" : "https://perladvent.org/2004/18th/" 42 | } 43 | ], 44 | "Acme-Grep2D" : [ 45 | { 46 | "title" : "Finding the perfect tree topper", 47 | "url" : "https://perladvent.org/2009/25/" 48 | } 49 | ], 50 | "Acme-Intraweb" : [ 51 | { 52 | "title" : "Acme::Intraweb", 53 | "url" : "https://perladvent.org/2002/17th/" 54 | } 55 | ], 56 | "Acme-MetaSyntactic" : [ 57 | { 58 | "title" : "crash kayo zamm splatt", 59 | "url" : "https://perladvent.org/2015/2015-12-14.html" 60 | } 61 | ], 62 | "Algorithm-Kmeans" : [ 63 | { 64 | "title" : "All I want for Christmas...Is Statistically Calcuable", 65 | "url" : "https://perladvent.org/2016/2016-12-22.html" 66 | } 67 | ], 68 | "AnsibleModule" : [ 69 | { 70 | "title" : "Automate Christmas with Ansible and Perl", 71 | "url" : "https://perladvent.org/2015/2015-12-22.html" 72 | } 73 | ], 74 | "Any-Moose-Forcefully" : [ 75 | { 76 | "title" : "Not a creature was stirring…", 77 | "url" : "https://perladvent.org/2009/1/" 78 | } 79 | ], 80 | "AnyEvent" : [ 81 | { 82 | "title" : "Synchronous Operations are So Outdated", 83 | "url" : "https://perladvent.org/2012/2012-12-18.html" 84 | }, 85 | { 86 | "title" : "Out of Order Perl", 87 | "url" : "https://perladvent.org/2014/2014-12-24.html" 88 | } 89 | ], 90 | "App-Asciio" : [ 91 | { 92 | "title" : "Holiday Armadillo", 93 | "url" : "https://perladvent.org/2008/21/" 94 | } 95 | ], 96 | "App-CGIThis" : [ 97 | { 98 | "title" : "northpole.cgi", 99 | "url" : "https://perladvent.org/2022/2022-12-04.html" 100 | } 101 | ], 102 | "App-FatPacker" : [ 103 | { 104 | "title" : "Self-contained applications", 105 | "url" : "https://perladvent.org/2012/2012-12-14.html" 106 | } 107 | ], 108 | "App-GitGot" : [ 109 | { 110 | "title" : "Got Git? Ask Santa to get Got!", 111 | "url" : "https://perladvent.org/2013/2013-12-15.html" 112 | } 113 | ], 114 | "App-HTTPSThis" : [ 115 | { 116 | "title" : "Watching The Perl Conference Again", 117 | "url" : "https://perladvent.org/2018/2018-12-24.html" 118 | } 119 | ], 120 | "App-HTTPThis" : [ 121 | { 122 | "title" : "Watching The Perl Conference Again", 123 | "url" : "https://perladvent.org/2018/2018-12-24.html" 124 | } 125 | ], 126 | "App-Legion" : [ 127 | { 128 | "title" : "Swarm your webserver", 129 | "url" : "https://perladvent.org/2013/2013-12-03.html" 130 | } 131 | ], 132 | "App-Nopaste" : [ 133 | { 134 | "title" : "Don't Get Kickbanned", 135 | "url" : "https://perladvent.org/2011/2011-12-14.html" 136 | } 137 | ], 138 | "App-PAUSE-CheckPerms" : [ 139 | { 140 | "title" : "The PAUSE Permissions Model", 141 | "url" : "https://perladvent.org/2013/2013-12-08.html" 142 | } 143 | ], 144 | "App-Sigfix" : [ 145 | { 146 | "title" : "The Fix Is In", 147 | "url" : "https://perladvent.org/2018/2018-12-09.html" 148 | } 149 | ], 150 | "App-Spec" : [ 151 | { 152 | "title" : "Writing command line tools made easy", 153 | "url" : "https://perladvent.org/2016/2016-12-17.html" 154 | } 155 | ], 156 | "App-Uni" : [ 157 | { 158 | "title" : "Where Does He Get Those Wonderful Codepoints?", 159 | "url" : "https://perladvent.org/2011/2011-12-24.html" 160 | } 161 | ], 162 | "App-ack" : [ 163 | { 164 | "title" : "Beyond Grep", 165 | "url" : "https://perladvent.org/2014/2014-12-21.html" 166 | } 167 | ], 168 | "App-ccdiff" : [ 169 | { 170 | "title" : "Spot The Difference", 171 | "url" : "https://perladvent.org/2018/2018-12-15.html" 172 | } 173 | ], 174 | "App-cpanoutdated" : [ 175 | { 176 | "title" : "Keeping up with the Joneses", 177 | "url" : "https://perladvent.org/2011/2011-12-02.html" 178 | } 179 | ], 180 | "App-cpm" : [ 181 | { 182 | "title" : "Fast CPAN Module Installation", 183 | "url" : "https://perladvent.org/2015/2015-12-02.html" 184 | } 185 | ], 186 | "App-perlbrew" : [ 187 | { 188 | "title" : "All the perls are all lined up", 189 | "url" : "https://perladvent.org/2011/2011-12-08.html" 190 | } 191 | ], 192 | "App-perlvars" : [ 193 | { 194 | "title" : "Finding Unused Perl Variables", 195 | "url" : "https://www.olafalders.com/2022/02/22/finding-unused-perl-variables/" 196 | } 197 | ], 198 | "App-perlzonji" : [ 199 | { 200 | "title" : "VAXmas", 201 | "url" : "https://perladvent.org/2010/12/" 202 | } 203 | ], 204 | "App-yath" : [ 205 | { 206 | "title" : "Testing our Impatience", 207 | "url" : "https://perladvent.org/2019/2019-12-23.html" 208 | } 209 | ], 210 | "Archive-Extract" : [ 211 | { 212 | "title" : "Archive::Extract", 213 | "url" : "https://perladvent.org/2004/15th/" 214 | } 215 | ], 216 | "Array-Sticky" : [ 217 | { 218 | "title" : "Sticky Delight", 219 | "url" : "https://perladvent.org/2018/2018-12-06.html" 220 | } 221 | ], 222 | "Array-Sticky-INC" : [ 223 | { 224 | "title" : "Sticky Delight", 225 | "url" : "https://perladvent.org/2018/2018-12-06.html" 226 | } 227 | ], 228 | "Attribute-Handlers" : [ 229 | { 230 | "title" : "Attribute::Handlers", 231 | "url" : "https://perladvent.org/2003/7th/" 232 | } 233 | ], 234 | "Authen-OATH" : [ 235 | { 236 | "title" : "Two Factor Elfication", 237 | "url" : "https://perladvent.org/2019/2019-12-03.html" 238 | }, 239 | { 240 | "title" : "TOTP with Perl and Authen::OATH", 241 | "url" : "https://lesterhightower.com/blog/posts/totp-with-perl-and-authenoath/" 242 | } 243 | ], 244 | "B" : [ 245 | { 246 | "title" : "Christmas Quoting", 247 | "url" : "https://perladvent.org/2018/2018-12-04.html" 248 | } 249 | ], 250 | "B-Fathom" : [ 251 | { 252 | "title" : "Dickens also rates an 8", 253 | "url" : "https://perladvent.org/2007/23/" 254 | } 255 | ], 256 | "B-perlstring" : [ 257 | { 258 | "title" : "Christmas Quoting", 259 | "url" : "https://perladvent.org/2018/2018-12-04.html" 260 | } 261 | ], 262 | "Babble" : [ 263 | { 264 | "title" : "The Fix Is In", 265 | "url" : "https://perladvent.org/2018/2018-12-09.html" 266 | }, 267 | { 268 | "title" : "Christmas Tree Babbles", 269 | "url" : "https://perladvent.org/2018/2018-12-10.html" 270 | } 271 | ], 272 | "Beam-Emitter" : [ 273 | { 274 | "title" : "Advent-based Programming", 275 | "url" : "https://perladvent.org/2013/2013-12-16.html" 276 | } 277 | ], 278 | "Bencher" : [ 279 | { 280 | "title" : "Benchmarking with Bencher", 281 | "url" : "https://perladvent.org/2016/2016-12-03.html" 282 | } 283 | ], 284 | "Benchmark" : [ 285 | { 286 | "title" : "Benchmark", 287 | "url" : "https://perladvent.org/2002/13th/" 288 | } 289 | ], 290 | "Benchmark-Timer" : [ 291 | { 292 | "title" : "Robot Santa asks 'Is your code nice enough?'", 293 | "url" : "https://perladvent.org/2010/21/" 294 | } 295 | ], 296 | "CGI-Ajax" : [ 297 | { 298 | "title" : "Buzzword Bingo", 299 | "url" : "https://perladvent.org/2005/9/" 300 | } 301 | ], 302 | "CGI-Application" : [ 303 | { 304 | "title" : "CGI::Application", 305 | "url" : "https://perladvent.org/2003/8th/" 306 | } 307 | ], 308 | "CGI-Minimal" : [ 309 | { 310 | "title" : "Are you naughty or nice?", 311 | "url" : "https://perladvent.org/2006/4/" 312 | } 313 | ], 314 | "CGI-Untaint" : [ 315 | { 316 | "title" : "CGI::Untaint", 317 | "url" : "https://perladvent.org/2003/1st/" 318 | } 319 | ], 320 | "CHI" : [ 321 | { 322 | "title" : "A Cache Present", 323 | "url" : "https://perladvent.org/2012/2012-12-19.html" 324 | } 325 | ], 326 | "CLDR-Number" : [ 327 | { 328 | "title" : "Stop Writing Your Own Commify Functions", 329 | "url" : "https://www.olafalders.com/2015/09/04/stop-writing-your-own-commify-functions/" 330 | } 331 | ], 332 | "CPAN-Audit" : [ 333 | { 334 | "title" : "Find known reported vulnerabilities in the modules you use", 335 | "url" : "https://perladvent.org/2022/2022-12-19.html" 336 | } 337 | ], 338 | "CPAN-Mini" : [ 339 | { 340 | "title" : "CPAN::Mini", 341 | "url" : "https://perladvent.org/2004/5th/" 342 | } 343 | ], 344 | "CPANPLUS" : [ 345 | { 346 | "title" : "CPANPLUS", 347 | "url" : "https://perladvent.org/2002/18th/" 348 | } 349 | ], 350 | "CPANfile" : [ 351 | { 352 | "title" : "Give the gift of dependency clarity", 353 | "url" : "https://perladvent.org/2013/2013-12-10.html" 354 | } 355 | ], 356 | "CSV" : [ 357 | { 358 | "title" : "Combining wishlists for production and shipping planning", 359 | "url" : "https://perladvent.org/2016/2016-12-10.html" 360 | } 361 | ], 362 | "Cache-Cache" : [ 363 | { 364 | "title" : "Cache::Cache", 365 | "url" : "https://perladvent.org/2004/16th/" 366 | } 367 | ], 368 | "Calendar-List" : [ 369 | { 370 | "title" : "Sign o' The Times", 371 | "url" : "https://perladvent.org/2018/2018-12-01.html" 372 | } 373 | ], 374 | "Capture-Tiny" : [ 375 | { 376 | "title" : "Wrapping output", 377 | "url" : "https://perladvent.org/2014/2014-12-19.html" 378 | } 379 | ], 380 | "Carp-Always" : [ 381 | { 382 | "title" : "Warn Different", 383 | "url" : "https://perladvent.org/2011/2011-12-04.html" 384 | } 385 | ], 386 | "Carp-REPL" : [ 387 | { 388 | "title" : "karp bożonarodzenie OR Dear Santa Please REPL", 389 | "url" : "https://perladvent.org/2010/11/" 390 | } 391 | ], 392 | "Carton" : [ 393 | { 394 | "title" : "Lapland Packaging Department - Part 2", 395 | "url" : "https://perladvent.org/2022/2022-12-21.html" 396 | } 397 | ], 398 | "Champlain" : [ 399 | { 400 | "title" : "Merry Christmap", 401 | "url" : "https://perladvent.org/2010/5/" 402 | } 403 | ], 404 | "Chart-Bars" : [ 405 | { 406 | "title" : "Looking at the Christmas Numbers", 407 | "url" : "https://perladvent.org/2022/2022-12-24.html" 408 | } 409 | ], 410 | "Chart-Lines" : [ 411 | { 412 | "title" : "At the Present Factory", 413 | "url" : "https://perladvent.org/2022/2022-12-23.html" 414 | } 415 | ], 416 | "Class-Accessor-Chained" : [ 417 | { 418 | "title" : "Class::Accessor::Chained", 419 | "url" : "https://perladvent.org/2004/3rd/" 420 | } 421 | ], 422 | "Class-DBI" : [ 423 | { 424 | "title" : "Class::DBI", 425 | "url" : "https://perladvent.org/2002/23rd/" 426 | } 427 | ], 428 | "Class-Data-Inheritable" : [ 429 | { 430 | "title" : "Class::Data::Inheritable", 431 | "url" : "https://perladvent.org/2002/20th/" 432 | } 433 | ], 434 | "Class-ISA" : [ 435 | { 436 | "title" : "Class::ISA", 437 | "url" : "https://perladvent.org/2003/12th/" 438 | } 439 | ], 440 | "Code-TidyAll" : [ 441 | { 442 | "title" : "How Santa's Elves Keep their Workshop Tidy", 443 | "url" : "https://perladvent.org/2014/2014-12-16.html" 444 | } 445 | ], 446 | "Code-TidyAll-Plugin-Test-Vars" : [ 447 | { 448 | "title" : "Finding Unused Perl Variables", 449 | "url" : "https://www.olafalders.com/2022/02/22/finding-unused-perl-variables/" 450 | } 451 | ], 452 | "Config-General" : [ 453 | { 454 | "title" : "The Toy-O-Matic (3000X!)", 455 | "url" : "https://perladvent.org/2008/18/" 456 | } 457 | ], 458 | "Config-Station" : [ 459 | { 460 | "title" : "Configuration Station", 461 | "url" : "https://perladvent.org/2015/2015-12-12.html" 462 | } 463 | ], 464 | "Const-Fast" : [ 465 | { 466 | "title" : "Constantly Merry", 467 | "url" : "https://perladvent.org/2017/2017-12-08.html" 468 | } 469 | ], 470 | "Context-Singleton" : [ 471 | { 472 | "title" : "Legacy code strikes again", 473 | "url" : "https://perladvent.org/2018/2018-12-23.html" 474 | } 475 | ], 476 | "Convert-CookingTimes" : [ 477 | { 478 | "title" : "Calculating cooking times the easy way", 479 | "url" : "https://perladvent.org/2015/2015-12-06.html" 480 | } 481 | ], 482 | "Cpanel-JSON-XS" : [ 483 | { 484 | "title" : "REST API and the Baby", 485 | "url" : "https://perladvent.org/2018/2018-12-03.html" 486 | } 487 | ], 488 | "Cpanel-JSON-XS-Type" : [ 489 | { 490 | "title" : "REST API and the Baby", 491 | "url" : "https://perladvent.org/2018/2018-12-03.html" 492 | } 493 | ], 494 | "DBD-MariaDB" : [ 495 | { 496 | "title" : "DBD-mysql versus DBD-MariaDB", 497 | "url" : "https://perladvent.org/2018/2018-12-08.html" 498 | } 499 | ], 500 | "DBD-SQLite" : [ 501 | { 502 | "title" : "DBD::SQLite", 503 | "url" : "https://perladvent.org/2002/3rd/" 504 | } 505 | ], 506 | "DBIx-Class" : [ 507 | { 508 | "title" : "Set-based DBIx::Class", 509 | "url" : "https://perladvent.org/2012/2012-12-21.html" 510 | } 511 | ], 512 | "DBIx-Connector" : [ 513 | { 514 | "title" : "Less Tedium More Transactions", 515 | "url" : "https://perladvent.org/2011/2011-12-22.html" 516 | } 517 | ], 518 | "DBIx-Introspector" : [ 519 | { 520 | "title" : "Shake those gifts and figure out what's inside!", 521 | "url" : "https://perladvent.org/2013/2013-12-14.html" 522 | } 523 | ], 524 | "DBIx-Profile" : [ 525 | { 526 | "title" : "Brown paper packages tied up with string", 527 | "url" : "https://perladvent.org/2007/3/" 528 | } 529 | ], 530 | "DBIx-RunSQL" : [ 531 | { 532 | "title" : "Now I have an SQL machine gun", 533 | "url" : "https://perladvent.org/2011/2011-12-12.html" 534 | } 535 | ], 536 | "Dancer" : [ 537 | { 538 | "title" : "Reindeer Games", 539 | "url" : "https://perladvent.org/2012/2012-12-05.html" 540 | } 541 | ], 542 | "Dancer-SearchApp" : [ 543 | { 544 | "title" : "Organizing catalogues and wishlists with Dancer::SearchApp", 545 | "url" : "https://perladvent.org/2016/2016-12-21.html" 546 | } 547 | ], 548 | "DarkSky-API" : [ 549 | { 550 | "title" : "The Weather Outside Is Frightful", 551 | "url" : "https://perladvent.org/2019/2019-12-06.html" 552 | } 553 | ], 554 | "Data-COW" : [ 555 | { 556 | "title" : "Data::COW", 557 | "url" : "https://perladvent.org/2005/15/" 558 | } 559 | ], 560 | "Data-Dimensions" : [ 561 | { 562 | "title" : "Data::Dimensions", 563 | "url" : "https://perladvent.org/2003/9th/" 564 | } 565 | ], 566 | "Data-Dumper-Simple" : [ 567 | { 568 | "title" : "Data::Dumper::Simple", 569 | "url" : "https://perladvent.org/2004/8th/" 570 | } 571 | ], 572 | "Data-ICal" : [ 573 | { 574 | "title" : "On the ... which day again?!?", 575 | "url" : "https://perladvent.org/2007/1/" 576 | } 577 | ], 578 | "Data-ICal-DateTime" : [ 579 | { 580 | "title" : "Christmas Timekeeping", 581 | "url" : "https://perladvent.org/2014/2014-12-18.html" 582 | } 583 | ], 584 | "Data-Password-zxcvbn" : [ 585 | { 586 | "title" : "J1ngle? No...zxcvbn", 587 | "url" : "https://perladvent.org/2019/2019-12-01.html" 588 | } 589 | ], 590 | "Data-Printer" : [ 591 | { 592 | "title" : "Checking Out Your Data Structures", 593 | "url" : "https://perladvent.org/2012/2012-12-06.html" 594 | } 595 | ], 596 | "Data-Rmap" : [ 597 | { 598 | "title" : "Data-Rmap - Santa's deepdive in an ocean of stockings.", 599 | "url" : "https://perladvent.org/2018/2018-12-05.html" 600 | } 601 | ], 602 | "Data-SearchEngine" : [ 603 | { 604 | "title" : "Taming Search with Data::SearchEngine", 605 | "url" : "https://perladvent.org/2011/2011-12-09.html" 606 | } 607 | ], 608 | "Data-Structure-Util" : [ 609 | { 610 | "title" : "Data::Structure::Util", 611 | "url" : "https://perladvent.org/2003/24th/" 612 | } 613 | ], 614 | "Data-UUID" : [ 615 | { 616 | "title" : "Data::UUID", 617 | "url" : "https://perladvent.org/2004/10th/" 618 | } 619 | ], 620 | "Date-Calc" : [ 621 | { 622 | "title" : "Counting down the days...", 623 | "url" : "https://perladvent.org/2006/20/" 624 | } 625 | ], 626 | "Date-Parse" : [ 627 | { 628 | "title" : "Date::Parse", 629 | "url" : "https://perladvent.org/2003/14th/" 630 | } 631 | ], 632 | "DateTime" : [ 633 | { 634 | "title" : "DateTime", 635 | "url" : "https://perladvent.org/2004/1st/" 636 | } 637 | ], 638 | "DateTime-Moonpig" : [ 639 | { 640 | "title" : "DateTimes", 641 | "url" : "https://perladvent.org/2013/2013-12-23.html" 642 | } 643 | ], 644 | "DateTime-TimeZone" : [ 645 | { 646 | "title" : "Timely Flight Planning for a Sleigh", 647 | "url" : "https://perladvent.org/2007/16/" 648 | } 649 | ], 650 | "Devel-CompiledCalls" : [ 651 | { 652 | "title" : "Present Confusion", 653 | "url" : "https://perladvent.org/2013/2013-12-12.html" 654 | } 655 | ], 656 | "Devel-Cover" : [ 657 | { 658 | "title" : "Warm Fuzzy Coverage", 659 | "url" : "https://perladvent.org/2006/21/" 660 | } 661 | ], 662 | "Devel-DProf" : [ 663 | { 664 | "title" : "Devel::DProf", 665 | "url" : "https://perladvent.org/2002/25th/" 666 | } 667 | ], 668 | "Devel-Eval" : [ 669 | { 670 | "title" : "Debuggin' blinken strings", 671 | "url" : "https://perladvent.org/2010/4/" 672 | } 673 | ], 674 | "Devel-Hide" : [ 675 | { 676 | "title" : "Help! Rudolf's Nose Won't Light Up!", 677 | "url" : "https://perladvent.org/2015/2015-12-04.html" 678 | } 679 | ], 680 | "Devel-MAT" : [ 681 | { 682 | "title" : "A Christmas Memory", 683 | "url" : "https://perladvent.org/2017/2017-12-12.html" 684 | } 685 | ], 686 | "Devel-Size" : [ 687 | { 688 | "title" : "Devel::Size", 689 | "url" : "https://perladvent.org/2002/6th/" 690 | } 691 | ], 692 | "Devel-SmallProf" : [ 693 | { 694 | "title" : "Good things come in small packages", 695 | "url" : "https://perladvent.org/2006/1/" 696 | } 697 | ], 698 | "Devel-Trace" : [ 699 | { 700 | "title" : "Devel::Trace", 701 | "url" : "https://perladvent.org/2004/13th/" 702 | } 703 | ], 704 | "Devel-cst" : [ 705 | { 706 | "title" : "The Emergency Debugger", 707 | "url" : "https://perladvent.org/2013/2013-12-24.html" 708 | } 709 | ], 710 | "Devel-hdb" : [ 711 | { 712 | "title" : "Debug Hard", 713 | "url" : "https://perladvent.org/2018/2018-12-21.html" 714 | } 715 | ], 716 | "Device-Chip-Adapter" : [ 717 | { 718 | "title" : "The Perl Powered Christmas Tree", 719 | "url" : "https://perladvent.org/2015/2015-12-24.html" 720 | } 721 | ], 722 | "Digest-BubbleBabble" : [ 723 | { 724 | "title" : "xikoh-tomos-luhag-hycun-kupul-rulal-rudap-vysem-tacut-savyr-luxox", 725 | "url" : "https://perladvent.org/2010/22/" 726 | } 727 | ], 728 | "Dist-Zilla-LocaleTextDomain" : [ 729 | { 730 | "title" : "Localize Your Perl Apps with this One Weird Trick", 731 | "url" : "https://perladvent.org/2013/2013-12-09.html" 732 | } 733 | ], 734 | "Dist-Zilla-Plugin-ReportVersions-Tiny" : [ 735 | { 736 | "title" : "Which Library Broke?", 737 | "url" : "https://perladvent.org/2012/2012-12-04.html" 738 | } 739 | ], 740 | "Dist-Zilla-Plugin-Test-TidyAll" : [ 741 | { 742 | "title" : "Finding Unused Perl Variables", 743 | "url" : "https://www.olafalders.com/2022/02/22/finding-unused-perl-variables/" 744 | } 745 | ], 746 | "Emoji-NationalFlag" : [ 747 | { 748 | "title" : "Around the world with Emoji", 749 | "url" : "https://perladvent.org/2017/2017-12-02.html" 750 | } 751 | ], 752 | "Encode" : [ 753 | { 754 | "title" : "Encode", 755 | "url" : "https://perladvent.org/2004/11th/" 756 | } 757 | ], 758 | "Enum" : [ 759 | { 760 | "title" : "Three french toasts", 761 | "url" : "https://perladvent.org/2005/24/" 762 | } 763 | ], 764 | "Env-Sanctify" : [ 765 | { 766 | "title" : "$HOME for the holidays", 767 | "url" : "https://perladvent.org/2010/15/" 768 | } 769 | ], 770 | "Eval-Closure" : [ 771 | { 772 | "title" : "Evaluating the NaughtyNice Formula", 773 | "url" : "https://perladvent.org/2017/2017-12-10.html" 774 | } 775 | ], 776 | "Every" : [ 777 | { 778 | "title" : "Let it go let it go let it go", 779 | "url" : "https://perladvent.org/2009/4/" 780 | } 781 | ], 782 | "FFI-Platypus" : [ 783 | { 784 | "title" : "Going for Perl", 785 | "url" : "https://perladvent.org/2019/2019-12-04.html" 786 | } 787 | ], 788 | "FFI-Raw" : [ 789 | { 790 | "title" : "Foreign Function Interface and Perl", 791 | "url" : "https://perladvent.org/2014/2014-12-10.html" 792 | } 793 | ], 794 | "Fatal" : [ 795 | { 796 | "title" : "Grandma Got Run Over by a Reindeer", 797 | "url" : "https://perladvent.org/2006/10/" 798 | } 799 | ], 800 | "Feature-Compat-Try" : [ 801 | { 802 | "title" : "The Christmas Time Machine", 803 | "url" : "https://perladvent.org/2022/2022-12-10.html" 804 | } 805 | ], 806 | "File-AtomicWrite" : [ 807 | { 808 | "title" : "Atomic Gift Wrapping", 809 | "url" : "https://perladvent.org/2012/2012-12-08.html" 810 | } 811 | ], 812 | "File-Find-Object" : [ 813 | { 814 | "title" : "Peeking under the tree", 815 | "url" : "https://perladvent.org/2006/2/" 816 | } 817 | ], 818 | "File-Find-Rule" : [ 819 | { 820 | "title" : "File::Find::Rule", 821 | "url" : "https://perladvent.org/2002/11th/" 822 | } 823 | ], 824 | "File-Flock-Tiny" : [ 825 | { 826 | "title" : "Gift Wrapping part II: Locking the Room", 827 | "url" : "https://perladvent.org/2012/2012-12-15.html" 828 | } 829 | ], 830 | "File-HomeDir" : [ 831 | { 832 | "title" : "I'll Be Home for Christmas", 833 | "url" : "https://perladvent.org/2006/15/" 834 | } 835 | ], 836 | "File-MMagic" : [ 837 | { 838 | "title" : "File::MMagic", 839 | "url" : "https://perladvent.org/2002/7th/" 840 | } 841 | ], 842 | "File-ReadBackwards" : [ 843 | { 844 | "title" : "He's making a list Checking it twice", 845 | "url" : "https://perladvent.org/2007/6/" 846 | } 847 | ], 848 | "File-Serialize" : [ 849 | { 850 | "title" : "Garlands of YAML and JSON", 851 | "url" : "https://perladvent.org/2015/2015-12-15.html" 852 | } 853 | ], 854 | "File-ShareDir-Tarball" : [ 855 | { 856 | "title" : "The Greatest Tradition of All", 857 | "url" : "https://perladvent.org/2012/2012-12-10.html" 858 | } 859 | ], 860 | "File-SortedSeek" : [ 861 | { 862 | "title" : "Olly Olly Oxen Free", 863 | "url" : "https://perladvent.org/2006/8/" 864 | } 865 | ], 866 | "File-Which" : [ 867 | { 868 | "title" : "All I want for Christmas is Perl 5.10", 869 | "url" : "https://perladvent.org/2007/5/" 870 | } 871 | ], 872 | "File-chdir" : [ 873 | { 874 | "title" : "File::chdir", 875 | "url" : "https://perladvent.org/2003/11th/" 876 | } 877 | ], 878 | "Filesys-Virtual" : [ 879 | { 880 | "title" : "Filesys::Virtual", 881 | "url" : "https://perladvent.org/2004/20th/" 882 | } 883 | ], 884 | "ForkBlock" : [ 885 | { 886 | "title" : "Merry forking() Christmas", 887 | "url" : "https://perladvent.org/2008/15/" 888 | } 889 | ], 890 | "GD" : [ 891 | { 892 | "title" : "Animated GIFs", 893 | "url" : "https://perladvent.org/2019/2019-12-14.html" 894 | } 895 | ], 896 | "GD-Simple" : [ 897 | { 898 | "title" : "Putting Tinsel on the Tree", 899 | "url" : "https://perladvent.org/2006/11/" 900 | } 901 | ], 902 | "GUIDeFATE" : [ 903 | { 904 | "title" : "Now With Added Interactivity", 905 | "url" : "https://perladvent.org/2019/2019-12-12.html" 906 | } 907 | ], 908 | "Geo-Coder-OpenCage" : [ 909 | { 910 | "title" : "Geocoding the world at volume with open data", 911 | "url" : "https://perladvent.org/2016/2016-12-08.html" 912 | } 913 | ], 914 | "Geo-Parser-Text" : [ 915 | { 916 | "title" : "A Geo Parser for vast amounts of Text", 917 | "url" : "https://perladvent.org/2016/2016-12-16.html" 918 | } 919 | ], 920 | "GeoIP2" : [ 921 | { 922 | "title" : "Where in the World?", 923 | "url" : "https://perladvent.org/2015/2015-12-01.html" 924 | } 925 | ], 926 | "Git-Hooks" : [ 927 | { 928 | "title" : "Writing git hooks with Git::Hooks", 929 | "url" : "https://perladvent.org/2016/2016-12-07.html" 930 | } 931 | ], 932 | "GitStore" : [ 933 | { 934 | "title" : "Toystore Story", 935 | "url" : "https://perladvent.org/2013/2013-12-11.html" 936 | } 937 | ], 938 | "Graph-Easy" : [ 939 | { 940 | "title" : "Gift Exchanges as a Practical Example of Cyclic Directional Graphs", 941 | "url" : "https://perladvent.org/2013/2013-12-04.html" 942 | } 943 | ], 944 | "GraphViz2" : [ 945 | { 946 | "title" : "The Delivery Map", 947 | "url" : "https://perladvent.org/2022/2022-12-12.html" 948 | } 949 | ], 950 | "HTML-Entities" : [ 951 | { 952 | "title" : "HTML::Entities", 953 | "url" : "https://perladvent.org/2003/2nd/" 954 | } 955 | ], 956 | "HTML-Lint" : [ 957 | { 958 | "title" : "Keeping it clean", 959 | "url" : "https://perladvent.org/2005/14/" 960 | } 961 | ], 962 | "HTTP-Caching" : [ 963 | { 964 | "title" : "speeding up the inter-web", 965 | "url" : "https://perladvent.org/2016/2016-12-23.html" 966 | } 967 | ], 968 | "HTTP-Message-PSGI" : [ 969 | { 970 | "title" : "Draft Solution", 971 | "url" : "https://perladvent.org/2019/2019-12-13.html" 972 | } 973 | ], 974 | "HTTP-Tiny" : [ 975 | { 976 | "title" : "Attention Seeking Behavior", 977 | "url" : "https://perladvent.org/2014/2014-12-03.html" 978 | } 979 | ], 980 | "Hash-Flatten" : [ 981 | { 982 | "title" : "Handling complex data structures", 983 | "url" : "https://perladvent.org/2018/2018-12-16.html" 984 | } 985 | ], 986 | "Hook-LexWrap" : [ 987 | { 988 | "title" : "Hook::LexWrap", 989 | "url" : "https://perladvent.org/2003/3rd/" 990 | } 991 | ], 992 | "IO-AtomicFile" : [ 993 | { 994 | "title" : "IO::AtomicFile", 995 | "url" : "https://perladvent.org/2002/2nd/" 996 | } 997 | ], 998 | "IO-Prompt-Tiny" : [ 999 | { 1000 | "title" : "Making a list and checking it twice", 1001 | "url" : "https://perladvent.org/2012/2012-12-11.html" 1002 | } 1003 | ], 1004 | "IPC-Filter" : [ 1005 | { 1006 | "title" : "Running in a filtered wonderland", 1007 | "url" : "https://perladvent.org/2008/8/" 1008 | } 1009 | ], 1010 | "IPC-Run3" : [ 1011 | { 1012 | "title" : "Three I/O Channels Too Many Options & a Command to Run with IPC", 1013 | "url" : "https://perladvent.org/2006/14/" 1014 | } 1015 | ], 1016 | "Image-Size" : [ 1017 | { 1018 | "title" : "Image::Size", 1019 | "url" : "https://perladvent.org/2002/5th/" 1020 | } 1021 | ], 1022 | "Imager" : [ 1023 | { 1024 | "title" : "We Wish You a Meme Christmas", 1025 | "url" : "https://perladvent.org/2019/2019-12-24.html" 1026 | } 1027 | ], 1028 | "Import-Into" : [ 1029 | { 1030 | "title" : "North Pole Safety Precautions", 1031 | "url" : "https://perladvent.org/2017/2017-12-06.html" 1032 | } 1033 | ], 1034 | "Inline-Java" : [ 1035 | { 1036 | "title" : "Inline::Java", 1037 | "url" : "https://perladvent.org/2003/21st/" 1038 | } 1039 | ], 1040 | "Inline-TT" : [ 1041 | { 1042 | "title" : "Inline::TT", 1043 | "url" : "https://perladvent.org/2002/19th/" 1044 | } 1045 | ], 1046 | "Interpolation" : [ 1047 | { 1048 | "title" : "On the ordinate(6) day of X-Mas", 1049 | "url" : "https://perladvent.org/2005/6/" 1050 | } 1051 | ], 1052 | "JSON" : [ 1053 | { 1054 | "title" : "Give and Receive the Right Number of Gifts", 1055 | "url" : "https://perladvent.org/2012/2012-12-23.html" 1056 | } 1057 | ], 1058 | "JSON-Path" : [ 1059 | { 1060 | "title" : "(JSON::)Paths in the snow", 1061 | "url" : "https://perladvent.org/2015/2015-12-13.html" 1062 | } 1063 | ], 1064 | "LWP" : [ 1065 | { 1066 | "title" : "Perl & LWP", 1067 | "url" : "https://lwp.interglacial.com/" 1068 | } 1069 | ], 1070 | "LWP-ConsoleLogger" : [ 1071 | { 1072 | "title" : "Observing Network Traffic with LWP::ConsoleLogger::Everywhere", 1073 | "url" : "https://www.olafalders.com/2021/12/01/observing-network-traffic-with-lwp-consolelogger-everywhere/" 1074 | } 1075 | ], 1076 | "LWP-Simple" : [ 1077 | { 1078 | "title" : "LWP::Simple", 1079 | "url" : "https://perladvent.org/2003/22nd/" 1080 | } 1081 | ], 1082 | "Lingua-EN-Inflexion" : [ 1083 | { 1084 | "title" : "Improving User Messages", 1085 | "url" : "https://perladvent.org/2015/2015-12-05.html" 1086 | } 1087 | ], 1088 | "Lingua-Ident" : [ 1089 | { 1090 | "title" : "Mais si Virginie le Père Noël existe", 1091 | "url" : "https://perladvent.org/2008/4/" 1092 | } 1093 | ], 1094 | "Lingua-Translate" : [ 1095 | { 1096 | "title" : "L-HO-HO-HO-st in translation", 1097 | "url" : "https://perladvent.org/2008/14/" 1098 | } 1099 | ], 1100 | "Linux-Clone" : [ 1101 | { 1102 | "title" : "Using containers with Linux", 1103 | "url" : "https://perladvent.org/2016/2016-12-19.html" 1104 | } 1105 | ], 1106 | "Linux-Setns" : [ 1107 | { 1108 | "title" : "Using containers with Linux", 1109 | "url" : "https://perladvent.org/2016/2016-12-19.html" 1110 | } 1111 | ], 1112 | "Linux-Unshare" : [ 1113 | { 1114 | "title" : "Using containers with Linux", 1115 | "url" : "https://perladvent.org/2016/2016-12-19.html" 1116 | } 1117 | ], 1118 | "List-Gather" : [ 1119 | { 1120 | "title" : "Gathering all the Presents", 1121 | "url" : "https://perladvent.org/2016/2016-12-05.html" 1122 | } 1123 | ], 1124 | "List-Util" : [ 1125 | { 1126 | "title" : "Making Perl Functional", 1127 | "url" : "https://perladvent.org/2016/2016-12-15.html" 1128 | } 1129 | ], 1130 | "Log-Any" : [ 1131 | { 1132 | "title" : "Yuletide Logging", 1133 | "url" : "https://perladvent.org/2016/2016-12-04.html" 1134 | } 1135 | ], 1136 | "Logfile-Rotate" : [ 1137 | { 1138 | "title" : "Yule Log-Rolling", 1139 | "url" : "https://perladvent.org/2006/17/" 1140 | } 1141 | ], 1142 | "Lvalue" : [ 1143 | { 1144 | "title" : "Noëlvalue", 1145 | "url" : "https://perladvent.org/2009/24/" 1146 | } 1147 | ], 1148 | "MIDI-Drummer-Tiny" : [ 1149 | { 1150 | "title" : "MIDI Drummer Tutorial", 1151 | "url" : "https://ology.github.io/midi-drummer-tiny-tutorial/" 1152 | } 1153 | ], 1154 | "MIME-Base64" : [ 1155 | { 1156 | "title" : "TWVycnkgQ2hyaXN0bWFzIDop", 1157 | "url" : "https://perladvent.org/2022/2022-12-18.html" 1158 | } 1159 | ], 1160 | "Mac-Glue" : [ 1161 | { 1162 | "title" : "Mac::Glue", 1163 | "url" : "https://perladvent.org/2004/17th/" 1164 | } 1165 | ], 1166 | "Mac-Safari-JavaScript" : [ 1167 | { 1168 | "title" : "Making a list checking it twice...", 1169 | "url" : "https://perladvent.org/2014/2014-12-02.html" 1170 | } 1171 | ], 1172 | "Magpie" : [ 1173 | { 1174 | "title" : "REST-oring Christmas Tranquility", 1175 | "url" : "https://perladvent.org/2016/2016-12-11.html" 1176 | } 1177 | ], 1178 | "Mail-SpamAssassin" : [ 1179 | { 1180 | "title" : "Mail::SpamAssassin", 1181 | "url" : "https://perladvent.org/2003/6th/" 1182 | } 1183 | ], 1184 | "Mango" : [ 1185 | { 1186 | "title" : "Catching dreams", 1187 | "url" : "https://perladvent.org/2022/2022-12-05.html" 1188 | } 1189 | ], 1190 | "Match-Smart" : [ 1191 | { 1192 | "title" : "The children were smartly dressed in matching attire for the holidays", 1193 | "url" : "https://perladvent.org/2009/19/" 1194 | } 1195 | ], 1196 | "Math-BigApprox" : [ 1197 | { 1198 | "title" : "Sleighing big numbers", 1199 | "url" : "https://perladvent.org/2008/3/" 1200 | } 1201 | ], 1202 | "Math-BigInt" : [ 1203 | { 1204 | "title" : "Math::BigInt", 1205 | "url" : "https://perladvent.org/2003/16th/" 1206 | }, 1207 | { 1208 | "title" : "On the 8E00000000 day of Advent my True Language brought to me...", 1209 | "url" : "https://perladvent.org/2005/8/" 1210 | } 1211 | ], 1212 | "Math-Combinatorics" : [ 1213 | { 1214 | "title" : "Choosing the perfect secret santa", 1215 | "url" : "https://perladvent.org/2007/8/" 1216 | } 1217 | ], 1218 | "Math-Geometry-Voronoi" : [ 1219 | { 1220 | "title" : "Oh Voronoi night…", 1221 | "url" : "https://perladvent.org/2010/17/" 1222 | } 1223 | ], 1224 | "Math-Prime-TiedArray" : [ 1225 | { 1226 | "title" : "Primed for Christmas", 1227 | "url" : "https://perladvent.org/2008/2/" 1228 | } 1229 | ], 1230 | "Memoize" : [ 1231 | { 1232 | "title" : "Memories of Past Lives", 1233 | "url" : "https://perladvent.org/2019/2019-12-19.html" 1234 | } 1235 | ], 1236 | "Memoize-Expire" : [ 1237 | { 1238 | "title" : "Memories of Past Lives", 1239 | "url" : "https://perladvent.org/2019/2019-12-19.html" 1240 | } 1241 | ], 1242 | "Meta-Grapher-Moose" : [ 1243 | { 1244 | "title" : "Graphing Moose Classes Automatically", 1245 | "url" : "https://perladvent.org/2016/2016-12-01.html" 1246 | } 1247 | ], 1248 | "MetaCPAN-Client" : [ 1249 | { 1250 | "title" : "Finding CPAN distributions with github repositories", 1251 | "url" : "https://perladvent.org/2014/2014-12-15.html" 1252 | } 1253 | ], 1254 | "Method-ParamValidator" : [ 1255 | { 1256 | "title" : "Validation", 1257 | "url" : "https://perladvent.org/2018/2018-12-22.html" 1258 | } 1259 | ], 1260 | "Mite" : [ 1261 | { 1262 | "title" : "Silent Mite", 1263 | "url" : "https://perladvent.org/2022/2022-12-01.html" 1264 | } 1265 | ], 1266 | "Mo" : [ 1267 | { 1268 | "title" : "Show Me Mo'", 1269 | "url" : "https://perladvent.org/2019/2019-12-07.html" 1270 | } 1271 | ], 1272 | "Module-CPANFile" : [ 1273 | { 1274 | "title" : "Just What Are You Installing Now?", 1275 | "url" : "https://perladvent.org/2015/2015-12-10.html" 1276 | } 1277 | ], 1278 | "Module-CoreList" : [ 1279 | { 1280 | "title" : "Core Strength", 1281 | "url" : "https://perladvent.org/2019/2019-12-18.html" 1282 | } 1283 | ], 1284 | "Module-Pluggable" : [ 1285 | { 1286 | "title" : "Module::Pluggable", 1287 | "url" : "https://perladvent.org/2004/6th/" 1288 | } 1289 | ], 1290 | "Module-ScanDeps" : [ 1291 | { 1292 | "title" : "Should I expect help with my heating bill from Santa?", 1293 | "url" : "https://perladvent.org/2008/11/" 1294 | } 1295 | ], 1296 | "Module-Starter" : [ 1297 | { 1298 | "title" : "Santa's Little Helper", 1299 | "url" : "https://perladvent.org/2006/6/" 1300 | } 1301 | ], 1302 | "Mojo" : [ 1303 | { 1304 | "title" : "Mojolicious on the Command Line", 1305 | "url" : "https://perladvent.org/2017/2017-12-15.html" 1306 | } 1307 | ], 1308 | "Mojo-AsyncAwait" : [ 1309 | { 1310 | "title" : "Awaiting Christmas", 1311 | "url" : "https://perladvent.org/2019/2019-12-10.html" 1312 | } 1313 | ], 1314 | "Mojo-Pg" : [ 1315 | { 1316 | "title" : "Async PostgreSQL with Mojo::Pg", 1317 | "url" : "https://perladvent.org/2014/2014-12-09.html" 1318 | } 1319 | ], 1320 | "Mojo-Promise" : [ 1321 | { 1322 | "title" : "Cute Christmas Animals", 1323 | "url" : "https://perladvent.org/2018/2018-12-19.html" 1324 | } 1325 | ], 1326 | "Mojo-Transaction-Websocket" : [ 1327 | { 1328 | "title" : "Now With Added Interactivity", 1329 | "url" : "https://perladvent.org/2019/2019-12-11.html" 1330 | } 1331 | ], 1332 | "Mojo-UserAgent" : [ 1333 | { 1334 | "title" : "Mojolicious as a client", 1335 | "url" : "https://perladvent.org/2011/2011-12-11.html" 1336 | }, 1337 | { 1338 | "title" : "Escaping the Basement For Christmas", 1339 | "url" : "https://perladvent.org/2015/2015-12-23.html" 1340 | } 1341 | ], 1342 | "Mojolicious" : [ 1343 | { 1344 | "title" : "Now With Added Interactivity", 1345 | "url" : "https://perladvent.org/2019/2019-12-11.html" 1346 | }, 1347 | { 1348 | "title" : "Cute Christmas Animals", 1349 | "url" : "https://perladvent.org/2018/2018-12-19.html" 1350 | } 1351 | ], 1352 | "Mojolicious-Plugin-RevealJS" : [ 1353 | { 1354 | "title" : "Create Professional Slideshows with Mojolicious::Plugin::RevealJS", 1355 | "url" : "https://perladvent.org/2022/2022-12-15.html" 1356 | } 1357 | ], 1358 | "MooX-Options" : [ 1359 | { 1360 | "title" : "Now I Have Better Options", 1361 | "url" : "https://perladvent.org/2014/2014-12-13.html" 1362 | } 1363 | ], 1364 | "MooseX-AttributeShortcuts" : [ 1365 | { 1366 | "title" : "For Elves Shorter is Better", 1367 | "url" : "https://perladvent.org/2017/2017-12-16.html" 1368 | } 1369 | ], 1370 | "MooseX-ClassAttribute" : [ 1371 | { 1372 | "title" : "Project Multipli-sleigh-ion", 1373 | "url" : "https://perladvent.org/2017/2017-12-18.html" 1374 | } 1375 | ], 1376 | "MooseX-Getopt" : [ 1377 | { 1378 | "title" : "MooseX::Getopt saves Christmas", 1379 | "url" : "https://perladvent.org/2022/2022-12-02.html" 1380 | } 1381 | ], 1382 | "MooseX-LazyRequire" : [ 1383 | { 1384 | "title" : "Maybe not", 1385 | "url" : "https://perladvent.org/2017/2017-12-19.html" 1386 | } 1387 | ], 1388 | "MooseX-StrictConstructor" : [ 1389 | { 1390 | "title" : "More Moose More Discipline", 1391 | "url" : "https://perladvent.org/2013/2013-12-19.html" 1392 | }, 1393 | { 1394 | "title" : "Making a constructor argument list checking it twice.", 1395 | "url" : "https://perladvent.org/2017/2017-12-17.html" 1396 | } 1397 | ], 1398 | "MooseX-UndefTolerant-Attribute" : [ 1399 | { 1400 | "title" : "Maybe not", 1401 | "url" : "https://perladvent.org/2017/2017-12-19.html" 1402 | } 1403 | ], 1404 | "Mu" : [ 1405 | { 1406 | "title" : "Mu", 1407 | "url" : "https://perladvent.org/2018/2018-12-11.html" 1408 | } 1409 | ], 1410 | "Music-Duration-Partition" : [ 1411 | { 1412 | "title" : "Music::Duration::Partition Tutorial", 1413 | "url" : "https://ology.github.io/music-duration-partition-tutorial/" 1414 | } 1415 | ], 1416 | "Net-AMQP-RabbitMQ" : [ 1417 | { 1418 | "title" : "RabbitMQ-Tutorial-Perl", 1419 | "url" : "https://github.com/oylenshpeegul/RabbitMQ-Tutorial-Perl" 1420 | } 1421 | ], 1422 | "Net-CIDR-Lite" : [ 1423 | { 1424 | "title" : "Naughty or Nice Networks", 1425 | "url" : "https://perladvent.org/2022/2022-12-17.html" 1426 | } 1427 | ], 1428 | "Net-EmptyPort" : [ 1429 | { 1430 | "title" : "Command Line Browser Apps", 1431 | "url" : "https://perladvent.org/2019/2019-12-09.html" 1432 | } 1433 | ], 1434 | "Net-Server" : [ 1435 | { 1436 | "title" : "Net stockings are barely servicable gift receptacles", 1437 | "url" : "https://perladvent.org/2010/16/" 1438 | } 1439 | ], 1440 | "Net-Twitter-Lite" : [ 1441 | { 1442 | "title" : "Four Naughty Tweeting Birds", 1443 | "url" : "https://perladvent.org/2010/20/" 1444 | } 1445 | ], 1446 | "Number-WithError" : [ 1447 | { 1448 | "title" : "I'm Approximating a White Christmas", 1449 | "url" : "https://perladvent.org/2006/16/" 1450 | } 1451 | ], 1452 | "OAuth-CmdLine" : [ 1453 | { 1454 | "title" : "Christmas Tunes!", 1455 | "url" : "https://perladvent.org/2018/2018-12-17.html" 1456 | } 1457 | ], 1458 | "OAuth-CmdLine-Spotify" : [ 1459 | { 1460 | "title" : "Christmas Tunes!", 1461 | "url" : "https://perladvent.org/2018/2018-12-17.html" 1462 | } 1463 | ], 1464 | "Object-Realize-Later" : [ 1465 | { 1466 | "title" : "Object::Realize::Later", 1467 | "url" : "https://perladvent.org/2002/12th/" 1468 | } 1469 | ], 1470 | "Open-This" : [ 1471 | { 1472 | "title" : "Opening Files Quickly from Inside vim", 1473 | "url" : "https://www.olafalders.com/2022/01/05/open-this-file-from-inside-vim/" 1474 | } 1475 | ], 1476 | "PAR" : [ 1477 | { 1478 | "title" : "PAR", 1479 | "url" : "https://perladvent.org/2003/25th/" 1480 | } 1481 | ], 1482 | "PAR-Dist" : [ 1483 | { 1484 | "title" : "...and a PARtridge in a PAR tree", 1485 | "url" : "https://perladvent.org/2006/22/" 1486 | } 1487 | ], 1488 | "PDF-Reuse" : [ 1489 | { 1490 | "title" : "PDF::Reuse", 1491 | "url" : "https://perladvent.org/2003/18th/" 1492 | }, 1493 | { 1494 | "title" : "PDF-Reuse + Reduce & Recycle", 1495 | "url" : "https://perladvent.org/2016/2016-12-20.html" 1496 | } 1497 | ], 1498 | "PPI" : [ 1499 | { 1500 | "title" : "Using PPI for static analysis", 1501 | "url" : "https://perladvent.org/2016/2016-12-14.html" 1502 | } 1503 | ], 1504 | "PPI-HTML" : [ 1505 | { 1506 | "title" : "Pretty Pretty Pod", 1507 | "url" : "https://perladvent.org/2013/2013-12-20.html" 1508 | } 1509 | ], 1510 | "PPerl" : [ 1511 | { 1512 | "title" : "PPerl", 1513 | "url" : "https://perladvent.org/2003/4th/" 1514 | } 1515 | ], 1516 | "PSGI/Plack" : [ 1517 | { 1518 | "title" : "Web done better!", 1519 | "url" : "https://perladvent.org/2013/2013-12-07.html" 1520 | } 1521 | ], 1522 | "Package-Stash" : [ 1523 | { 1524 | "title" : "Unwrapping the Package(::Stash)", 1525 | "url" : "https://perladvent.org/2011/2011-12-07.html" 1526 | } 1527 | ], 1528 | "Parallel-Jobs" : [ 1529 | { 1530 | "title" : "Parallels parallels it's Christmas time in the city", 1531 | "url" : "https://perladvent.org/2007/2/" 1532 | } 1533 | ], 1534 | "Params-Util" : [ 1535 | { 1536 | "title" : "It Boiled Plate So You Don't Have To!", 1537 | "url" : "https://perladvent.org/2011/2011-12-23.html" 1538 | } 1539 | ], 1540 | "Params-Validate" : [ 1541 | { 1542 | "title" : "Params::Validate", 1543 | "url" : "https://perladvent.org/2002/10th/" 1544 | } 1545 | ], 1546 | "Params-Validate-Dependencies" : [ 1547 | { 1548 | "title" : "Too Many Choices For Santa", 1549 | "url" : "https://perladvent.org/2016/2016-12-09.html" 1550 | } 1551 | ], 1552 | "Params-ValidationCompiler" : [ 1553 | { 1554 | "title" : "Speedy Validation", 1555 | "url" : "https://perladvent.org/2017/2017-12-23.html" 1556 | } 1557 | ], 1558 | "Path-Class" : [ 1559 | { 1560 | "title" : "Sweet Path::Class is Coming to Town", 1561 | "url" : "https://perladvent.org/2012/2012-12-01.html" 1562 | } 1563 | ], 1564 | "Path-Class-Rule" : [ 1565 | { 1566 | "title" : "Process ALL the FILES!", 1567 | "url" : "https://perladvent.org/2011/2011-12-19.html" 1568 | } 1569 | ], 1570 | "Path-Tiny" : [ 1571 | { 1572 | "title" : "The little module that keeps on giving", 1573 | "url" : "https://perladvent.org/2013/2013-12-18.html" 1574 | }, 1575 | { 1576 | "title" : "Tiny Path Handling", 1577 | "url" : "https://perladvent.org/2017/2017-12-11.html" 1578 | } 1579 | ], 1580 | "Paws" : [ 1581 | { 1582 | "title" : "Paws to Plan What Todo", 1583 | "url" : "https://perladvent.org/2019/2019-12-16.html" 1584 | } 1585 | ], 1586 | "Perl-Compare" : [ 1587 | { 1588 | "title" : "Nothing compares to you", 1589 | "url" : "https://perladvent.org/2005/20/" 1590 | } 1591 | ], 1592 | "Perl-Critic" : [ 1593 | { 1594 | "title" : "Context Matters", 1595 | "url" : "https://perladvent.org/2017/2017-12-03.html" 1596 | } 1597 | ], 1598 | "Perl-Critic-Policy-Variables-ProhibitUnusedVarsStricter" : [ 1599 | { 1600 | "title" : "Finding Unused Perl Variables", 1601 | "url" : "https://www.olafalders.com/2022/02/22/finding-unused-perl-variables/" 1602 | } 1603 | ], 1604 | "Perl-Dist-APPerl" : [ 1605 | { 1606 | "title" : "How to wrap a camel?", 1607 | "url" : "https://perladvent.org/2022/2022-12-25.html" 1608 | } 1609 | ], 1610 | "Perl-Metrics-Simple" : [ 1611 | { 1612 | "title" : "The Complexity of Perl", 1613 | "url" : "https://perladvent.org/2014/2014-12-08.html" 1614 | } 1615 | ], 1616 | "Perl-MinimumVersion" : [ 1617 | { 1618 | "title" : "All I want for Christmas is something newer than 5.5.3", 1619 | "url" : "https://perladvent.org/2010/14/" 1620 | } 1621 | ], 1622 | "Perl-PrereqScanner" : [ 1623 | { 1624 | "title" : "Prereqing around the Christmas Tree", 1625 | "url" : "https://perladvent.org/2017/2017-12-14.html" 1626 | } 1627 | ], 1628 | "Perl6-Junction" : [ 1629 | { 1630 | "title" : "Conjunction Junction", 1631 | "url" : "https://perladvent.org/2005/11/" 1632 | } 1633 | ], 1634 | "PerlIO-gzip" : [ 1635 | { 1636 | "title" : "Christmas Movie Time!", 1637 | "url" : "https://perladvent.org/2019/2019-12-08.html" 1638 | } 1639 | ], 1640 | "PerlIO-zip" : [ 1641 | { 1642 | "title" : "Christmas Movie Time!", 1643 | "url" : "https://perladvent.org/2019/2019-12-08.html" 1644 | } 1645 | ], 1646 | "Perldoc-Server" : [ 1647 | { 1648 | "title" : "All Your Documentation Even Offline", 1649 | "url" : "https://perladvent.org/2011/2011-12-16.html" 1650 | } 1651 | ], 1652 | "Pinto" : [ 1653 | { 1654 | "title" : "Santa Has Dependencies Too", 1655 | "url" : "https://perladvent.org/2012/2012-12-17.html" 1656 | } 1657 | ], 1658 | "Pithub" : [ 1659 | { 1660 | "title" : "Santa is on GitHub", 1661 | "url" : "https://perladvent.org/2022/2022-12-03.html" 1662 | } 1663 | ], 1664 | "Pixie" : [ 1665 | { 1666 | "title" : "Pixie", 1667 | "url" : "https://perladvent.org/2002/24th/" 1668 | } 1669 | ], 1670 | "Plack" : [ 1671 | { 1672 | "title" : "Draft Solution", 1673 | "url" : "https://perladvent.org/2019/2019-12-13.html" 1674 | } 1675 | ], 1676 | "Plack-App-Path-Router" : [ 1677 | { 1678 | "title" : "A Holiday PAPR-ation", 1679 | "url" : "https://perladvent.org/2014/2014-12-22.html" 1680 | } 1681 | ], 1682 | "Pod-Cpandoc" : [ 1683 | { 1684 | "title" : "Install Even Less", 1685 | "url" : "https://perladvent.org/2011/2011-12-15.html" 1686 | } 1687 | ], 1688 | "Pod-Simple" : [ 1689 | { 1690 | "title" : "Subclassing all the way!", 1691 | "url" : "https://perladvent.org/2007/17/" 1692 | } 1693 | ], 1694 | "Pod-Usage" : [ 1695 | { 1696 | "title" : "Santa makes a list and checks it twice...", 1697 | "url" : "https://perladvent.org/2006/12/" 1698 | } 1699 | ], 1700 | "Proc-Daemon" : [ 1701 | { 1702 | "title" : "Proc::Daemon", 1703 | "url" : "https://perladvent.org/2004/9th/" 1704 | } 1705 | ], 1706 | "Process-Status" : [ 1707 | { 1708 | "title" : "No More Leaking Glue", 1709 | "url" : "https://perladvent.org/2015/2015-12-17.html" 1710 | } 1711 | ], 1712 | "RDF-Query" : [ 1713 | { 1714 | "title" : "Semantic Perl", 1715 | "url" : "https://perladvent.org/2013/2013-12-01.html" 1716 | } 1717 | ], 1718 | "RDF-Trine" : [ 1719 | { 1720 | "title" : "Semantic Perl", 1721 | "url" : "https://perladvent.org/2013/2013-12-01.html" 1722 | } 1723 | ], 1724 | "Redis" : [ 1725 | { 1726 | "title" : "Perl and Redis", 1727 | "url" : "https://perladvent.org/2015/2015-12-20.html" 1728 | } 1729 | ], 1730 | "Ref-Util" : [ 1731 | { 1732 | "title" : "Jingle Refs Jingle Refs Jingle all the way", 1733 | "url" : "https://perladvent.org/2016/2016-12-02.html" 1734 | } 1735 | ], 1736 | "Regex-Common" : [ 1737 | { 1738 | "title" : "Regex::Common", 1739 | "url" : "https://perladvent.org/2003/20th/" 1740 | } 1741 | ], 1742 | "Regexp-Assemble" : [ 1743 | { 1744 | "title" : "O Christmas Trie! O Christmas Trie!", 1745 | "url" : "https://perladvent.org/2005/18/" 1746 | } 1747 | ], 1748 | "Regexp-Keep" : [ 1749 | { 1750 | "title" : "A penny saved is a penny earned", 1751 | "url" : "https://perladvent.org/2005/13/" 1752 | } 1753 | ], 1754 | "Regexp-Subst-Parallel" : [ 1755 | { 1756 | "title" : "Egg substitute nog", 1757 | "url" : "https://perladvent.org/2008/22/" 1758 | } 1759 | ], 1760 | "Reindeer" : [ 1761 | { 1762 | "title" : "Reindeer", 1763 | "url" : "https://perladvent.org/2017/2017-12-20.html" 1764 | } 1765 | ], 1766 | "Reply" : [ 1767 | { 1768 | "title" : "Live programming perl with Reply", 1769 | "url" : "https://perladvent.org/2015/2015-12-08.html" 1770 | } 1771 | ], 1772 | "SQL-Abstract" : [ 1773 | { 1774 | "title" : "SQL::Abstract", 1775 | "url" : "https://perladvent.org/2004/14th/" 1776 | } 1777 | ], 1778 | "SVG" : [ 1779 | { 1780 | "title" : "Growing Christmas Trees", 1781 | "url" : "https://perladvent.org/2018/2018-12-12.html" 1782 | } 1783 | ], 1784 | "SVG-ChristmasTree" : [ 1785 | { 1786 | "title" : "Growing Christmas Trees", 1787 | "url" : "https://perladvent.org/2018/2018-12-12.html" 1788 | } 1789 | ], 1790 | "Safe" : [ 1791 | { 1792 | "title" : "Is your code… Safe?", 1793 | "url" : "https://perladvent.org/2012/2012-12-07.html" 1794 | } 1795 | ], 1796 | "Safe-Isa" : [ 1797 | { 1798 | "title" : "Playing it safe with Safe::Isa", 1799 | "url" : "https://perladvent.org/2013/2013-12-05.html" 1800 | } 1801 | ], 1802 | "Schedule-LongSteps" : [ 1803 | { 1804 | "title" : "Help Santa Klaus Reward Only Nice Children", 1805 | "url" : "https://perladvent.org/2016/2016-12-06.html" 1806 | } 1807 | ], 1808 | "Scope-Upper" : [ 1809 | { 1810 | "title" : "Sleigh Upgrade", 1811 | "url" : "https://perladvent.org/2012/2012-12-03.html" 1812 | } 1813 | ], 1814 | "SelfLoader" : [ 1815 | { 1816 | "title" : "Loads of Christmas cheer", 1817 | "url" : "https://perladvent.org/2008/16/" 1818 | } 1819 | ], 1820 | "Sereal" : [ 1821 | { 1822 | "title" : "Christmas Wishes", 1823 | "url" : "https://perladvent.org/2015/2015-12-18.html" 1824 | } 1825 | ], 1826 | "Set-Array" : [ 1827 | { 1828 | "title" : "Setting the bar high with an array of unique gifts", 1829 | "url" : "https://perladvent.org/2010/2/" 1830 | } 1831 | ], 1832 | "Set-CrossProduct" : [ 1833 | { 1834 | "title" : "Make all the combinations", 1835 | "url" : "https://perladvent.org/2011/2011-12-06.html" 1836 | } 1837 | ], 1838 | "Shell" : [ 1839 | { 1840 | "title" : "The Nutcracker", 1841 | "url" : "https://perladvent.org/2006/13/" 1842 | } 1843 | ], 1844 | "Smart-Comments" : [ 1845 | { 1846 | "title" : "Extracting more value out of your script's comments", 1847 | "url" : "https://perladvent.org/2015/2015-12-11.html" 1848 | } 1849 | ], 1850 | "Sort-ByExample" : [ 1851 | { 1852 | "title" : "Santa Sorts By Example", 1853 | "url" : "https://perladvent.org/2015/2015-12-19.html" 1854 | } 1855 | ], 1856 | "Sort-Half-Maker" : [ 1857 | { 1858 | "title" : "Xmas sort of title", 1859 | "url" : "https://perladvent.org/2008/24/" 1860 | } 1861 | ], 1862 | "Sort-Maker" : [ 1863 | { 1864 | "title" : "Sorting things out...", 1865 | "url" : "https://perladvent.org/2005/23/" 1866 | } 1867 | ], 1868 | "Stepford" : [ 1869 | { 1870 | "title" : "Building Santa's Naughty and Nice List with Stepford", 1871 | "url" : "https://perladvent.org/2015/2015-12-16.html" 1872 | } 1873 | ], 1874 | "String-Errf" : [ 1875 | { 1876 | "title" : "Throw Now Describe Later", 1877 | "url" : "https://perladvent.org/2013/2013-12-22.html" 1878 | } 1879 | ], 1880 | "String-ShellQuote" : [ 1881 | { 1882 | "title" : "String::ShellQuote", 1883 | "url" : "https://perladvent.org/2004/4th/" 1884 | } 1885 | ], 1886 | "Struct-Dumb" : [ 1887 | { 1888 | "title" : "Dumb In-struct-ions", 1889 | "url" : "https://perladvent.org/2014/2014-12-20.html" 1890 | } 1891 | ], 1892 | "Sub-Curry" : [ 1893 | { 1894 | "title" : "Baby it's cold outside so why don't we tuck into a curry?", 1895 | "url" : "https://perladvent.org/2008/6/" 1896 | } 1897 | ], 1898 | "Sub-Params" : [ 1899 | { 1900 | "title" : "Lost in legacy arguments", 1901 | "url" : "https://perladvent.org/2018/2018-12-13.html" 1902 | } 1903 | ], 1904 | "Sub-Util" : [ 1905 | { 1906 | "title" : "A Subroutine By Any Other Name", 1907 | "url" : "https://perladvent.org/2014/2014-12-05.html" 1908 | } 1909 | ], 1910 | "Sub-Versive" : [ 1911 | { 1912 | "title" : "E.L.F.", 1913 | "url" : "https://perladvent.org/2007/9/" 1914 | } 1915 | ], 1916 | "Syntax-Collector" : [ 1917 | { 1918 | "title" : "Creating Your Own Perl", 1919 | "url" : "https://perladvent.org/2012/2012-12-16.html" 1920 | } 1921 | ], 1922 | "Syntax-Keyord-Try" : [ 1923 | { 1924 | "title" : "Trying for a Happy Christmas", 1925 | "url" : "https://perladvent.org/2016/2016-12-12.html" 1926 | } 1927 | ], 1928 | "Sys-Hostname" : [ 1929 | { 1930 | "title" : "Sys::Hostname", 1931 | "url" : "https://perladvent.org/2004/21st/" 1932 | } 1933 | ], 1934 | "Template-Extract" : [ 1935 | { 1936 | "title" : "Template::Extract", 1937 | "url" : "https://perladvent.org/2003/5th/" 1938 | } 1939 | ], 1940 | "Term-ANSIColor" : [ 1941 | { 1942 | "title" : "Term::ANSIColor", 1943 | "url" : "https://perladvent.org/2004/2nd/" 1944 | } 1945 | ], 1946 | "Term-Animation" : [ 1947 | { 1948 | "title" : "Excited elfs", 1949 | "url" : "https://perladvent.org/2008/25/" 1950 | } 1951 | ], 1952 | "Term-Choose" : [ 1953 | { 1954 | "title" : "Choices choices so many choices!", 1955 | "url" : "https://perladvent.org/2017/2017-12-07.html" 1956 | } 1957 | ], 1958 | "Term-ProgressBar" : [ 1959 | { 1960 | "title" : "Term::ProgressBar", 1961 | "url" : "https://perladvent.org/2004/7th/" 1962 | } 1963 | ], 1964 | "Test-Builder" : [ 1965 | { 1966 | "title" : "Test::Builder", 1967 | "url" : "https://perladvent.org/2002/4th/" 1968 | } 1969 | ], 1970 | "Test-DatabaseRow" : [ 1971 | { 1972 | "title" : "Testing The Naughty Or Nice Database", 1973 | "url" : "https://perladvent.org/2014/2014-12-06.html" 1974 | } 1975 | ], 1976 | "Test-Differences" : [ 1977 | { 1978 | "title" : "You don't get a belly like this drinking skim milk", 1979 | "url" : "https://perladvent.org/2007/4/" 1980 | } 1981 | ], 1982 | "Test-Excel" : [ 1983 | { 1984 | "title" : "Test/Compare Your Excel", 1985 | "url" : "https://perladvent.org/2018/2018-12-18.html" 1986 | } 1987 | ], 1988 | "Test-Inline" : [ 1989 | { 1990 | "title" : "Test::Inline", 1991 | "url" : "https://perladvent.org/2003/10th/" 1992 | } 1993 | ], 1994 | "Test-Kit" : [ 1995 | { 1996 | "title" : "All I want for Christmas is less boilerplate", 1997 | "url" : "https://perladvent.org/2014/2014-12-14.html" 1998 | } 1999 | ], 2000 | "Test-LWP-UserAgent" : [ 2001 | { 2002 | "title" : "Testing networking client code using Test::LWP::UserAgent", 2003 | "url" : "https://perladvent.org/2012/2012-12-12.html" 2004 | } 2005 | ], 2006 | "Test-MockObject" : [ 2007 | { 2008 | "title" : "Test::MockObject", 2009 | "url" : "https://perladvent.org/2002/14th/" 2010 | } 2011 | ], 2012 | "Test-Perl-Critic" : [ 2013 | { 2014 | "title" : "Everyone loves a critic", 2015 | "url" : "https://perladvent.org/2005/19/" 2016 | } 2017 | ], 2018 | "Test-Perl-Critic-Progressive" : [ 2019 | { 2020 | "title" : "Resolution for next year: 1280x1024 or better", 2021 | "url" : "https://perladvent.org/2008/23/" 2022 | } 2023 | ], 2024 | "Test-Pretty" : [ 2025 | { 2026 | "title" : "Better Testing", 2027 | "url" : "https://perladvent.org/2012/2012-12-20.html" 2028 | } 2029 | ], 2030 | "Test-Requires" : [ 2031 | { 2032 | "title" : "Optional tests for optional requirements", 2033 | "url" : "https://perladvent.org/2014/2014-12-17.html" 2034 | } 2035 | ], 2036 | "Test-Routine" : [ 2037 | { 2038 | "title" : "Revisiting Test::Routine", 2039 | "url" : "https://perladvent.org/2011/2011-12-20.html" 2040 | } 2041 | ], 2042 | "Test-Simple" : [ 2043 | { 2044 | "title" : "Basic Testing Tutorial", 2045 | "url" : "https://www.perlmonks.org/?node_id=11106010" 2046 | } 2047 | ], 2048 | "Test-TCP" : [ 2049 | { 2050 | "title" : "Command Line Browser Apps", 2051 | "url" : "https://perladvent.org/2019/2019-12-09.html" 2052 | } 2053 | ], 2054 | "Test-TempDir-Tiny" : [ 2055 | { 2056 | "title" : "No Room At The I.N.N.", 2057 | "url" : "https://perladvent.org/2014/2014-12-01.html" 2058 | } 2059 | ], 2060 | "Test-Vars" : [ 2061 | { 2062 | "title" : "Finding Unused Perl Variables", 2063 | "url" : "https://www.olafalders.com/2022/02/22/finding-unused-perl-variables/" 2064 | } 2065 | ], 2066 | "Test2-Compare-Base" : [ 2067 | { 2068 | "title" : "Comparing More", 2069 | "url" : "https://perladvent.org/2019/2019-12-22.html" 2070 | } 2071 | ], 2072 | "Test2-Harness" : [ 2073 | { 2074 | "title" : "Testing our Impatience", 2075 | "url" : "https://perladvent.org/2019/2019-12-23.html" 2076 | } 2077 | ], 2078 | "Test2-Suite" : [ 2079 | { 2080 | "title" : "Test2: Test Harder (but easier)", 2081 | "url" : "https://perladvent.org/2019/2019-12-21.html" 2082 | }, 2083 | { 2084 | "title" : "Comparing More", 2085 | "url" : "https://perladvent.org/2019/2019-12-22.html" 2086 | } 2087 | ], 2088 | "Test2-V0" : [ 2089 | { 2090 | "title" : "Test2: Test Harder (but easier)", 2091 | "url" : "https://perladvent.org/2019/2019-12-21.html" 2092 | } 2093 | ], 2094 | "Text-BarGraph" : [ 2095 | { 2096 | "title" : "On the 2nd day of Xmas Santa hits the bar pretty hard!", 2097 | "url" : "https://perladvent.org/2010/18/" 2098 | } 2099 | ], 2100 | "Text-CSV-Pivot" : [ 2101 | { 2102 | "title" : "Convert CSV to Pivot Table", 2103 | "url" : "https://perladvent.org/2018/2018-12-07.html" 2104 | } 2105 | ], 2106 | "Text-Diff" : [ 2107 | { 2108 | "title" : "What's the diff between a biscuit and a reindeer?", 2109 | "url" : "https://perladvent.org/2006/18/" 2110 | } 2111 | ], 2112 | "Text-FIGlet" : [ 2113 | { 2114 | "title" : "It went zip when it moved and bopped when it stopped and whirred when it stood still", 2115 | "url" : "https://perladvent.org/2005/25/" 2116 | } 2117 | ], 2118 | "Text-Fuzzy" : [ 2119 | { 2120 | "title" : "Warm and Fuzzy Inside", 2121 | "url" : "https://perladvent.org/2016/2016-12-18.html" 2122 | } 2123 | ], 2124 | "Text-Glob" : [ 2125 | { 2126 | "title" : "Text::Glob", 2127 | "url" : "https://perladvent.org/2003/15th/" 2128 | } 2129 | ], 2130 | "Text-Hogan" : [ 2131 | { 2132 | "title" : "Sharing templates will get you on the nice list", 2133 | "url" : "https://perladvent.org/2015/2015-12-07.html" 2134 | } 2135 | ], 2136 | "Text-ParagraphDiff" : [ 2137 | { 2138 | "title" : "Twas the night before diffmas", 2139 | "url" : "https://perladvent.org/2010/24/" 2140 | } 2141 | ], 2142 | "Text-SpellChecker" : [ 2143 | { 2144 | "title" : "For Krismash I wante a pony (pleez)", 2145 | "url" : "https://perladvent.org/2008/13/" 2146 | } 2147 | ], 2148 | "Text-Unidecode" : [ 2149 | { 2150 | "title" : "Text::Unidecode", 2151 | "url" : "https://perladvent.org/2004/12th/" 2152 | } 2153 | ], 2154 | "Text-VimColor" : [ 2155 | { 2156 | "title" : "Pretty Pretty Pod", 2157 | "url" : "https://perladvent.org/2013/2013-12-20.html" 2158 | } 2159 | ], 2160 | "Text-vCard" : [ 2161 | { 2162 | "title" : "Checking the list twice", 2163 | "url" : "https://perladvent.org/2007/24/" 2164 | } 2165 | ], 2166 | "Tie-CharArray" : [ 2167 | { 2168 | "title" : "New Winter Spectator Sport - Thongs & Toboggans", 2169 | "url" : "https://perladvent.org/2009/2/" 2170 | } 2171 | ], 2172 | "Tie-File" : [ 2173 | { 2174 | "title" : "Tie::File", 2175 | "url" : "https://perladvent.org/2002/21st/" 2176 | } 2177 | ], 2178 | "Time-Duration" : [ 2179 | { 2180 | "title" : "How many days until Christmas?", 2181 | "url" : "https://perladvent.org/2013/2013-12-17.html" 2182 | } 2183 | ], 2184 | "Time-Limit" : [ 2185 | { 2186 | "title" : "Out of Time", 2187 | "url" : "https://perladvent.org/2014/2014-12-07.html" 2188 | } 2189 | ], 2190 | "Time-Out" : [ 2191 | { 2192 | "title" : "I can hardly wait", 2193 | "url" : "https://perladvent.org/2007/25/" 2194 | } 2195 | ], 2196 | "Tk" : [ 2197 | { 2198 | "title" : "Twelve Intrepid Ibex pulling a load of open source", 2199 | "url" : "https://perladvent.org/2008/12/" 2200 | } 2201 | ], 2202 | "Tkx" : [ 2203 | { 2204 | "title" : "Tkx Tkx Tkx… is Christmas every going to get here?", 2205 | "url" : "https://perladvent.org/2010/13/" 2206 | } 2207 | ], 2208 | "Treemap" : [ 2209 | { 2210 | "title" : "Data decorating the tips of a Christmas Treemap", 2211 | "url" : "https://perladvent.org/2006/3/" 2212 | } 2213 | ], 2214 | "Try-ALRM" : [ 2215 | { 2216 | "title" : "Wake up! Time to open presents! ", 2217 | "url" : "https://perladvent.org/2022/2022-12-11.html" 2218 | } 2219 | ], 2220 | "Try-Tiny" : [ 2221 | { 2222 | "title" : "There is No Try", 2223 | "url" : "https://perladvent.org/2011/2011-12-17.html" 2224 | } 2225 | ], 2226 | "Type-Tiny" : [ 2227 | { 2228 | "title" : "A Tiny But Powerful Type System", 2229 | "url" : "https://perladvent.org/2014/2014-12-11.html" 2230 | } 2231 | ], 2232 | "URI" : [ 2233 | { 2234 | "title" : "Don't Forget about URI::Heuristic", 2235 | "url" : "https://www.olafalders.com/2016/07/12/dont-forget-about-uriheuristic/" 2236 | } 2237 | ], 2238 | "URI-Find" : [ 2239 | { 2240 | "title" : "URI::Find", 2241 | "url" : "https://perladvent.org/2002/1st/" 2242 | } 2243 | ], 2244 | "Unicode-Tussle" : [ 2245 | { 2246 | "title" : "Where Does He Get Those Wonderful Codepoints?", 2247 | "url" : "https://perladvent.org/2011/2011-12-24.html" 2248 | } 2249 | ], 2250 | "Unicode-UCD" : [ 2251 | { 2252 | "title" : "It's All There in the Numbers!", 2253 | "url" : "https://perladvent.org/2017/2017-12-13.html" 2254 | } 2255 | ], 2256 | "Util-H2O" : [ 2257 | { 2258 | "title" : "St. Nick's Reindeers Need H2O!", 2259 | "url" : "https://perladvent.org/2022/2022-12-06.html" 2260 | } 2261 | ], 2262 | "Value-Diff" : [ 2263 | { 2264 | "title" : "What did Santa forget?", 2265 | "url" : "https://perladvent.org/2022/2022-12-09.html" 2266 | } 2267 | ], 2268 | "WWW-Mechanize" : [ 2269 | { 2270 | "title" : "WWW::Mechanize Best Practices", 2271 | "url" : "https://www.olafalders.com/2018/04/13/wwwmechanize-best-practices/" 2272 | } 2273 | ], 2274 | "WWW-YouTube-Download" : [ 2275 | { 2276 | "title" : "Watching The Perl Conference", 2277 | "url" : "https://perladvent.org/2017/2017-12-24.html" 2278 | } 2279 | ], 2280 | "Wallflower" : [ 2281 | { 2282 | "title" : "Generate static web sites using your favorite Perl framework", 2283 | "url" : "https://perladvent.org/2012/2012-12-22.html" 2284 | } 2285 | ], 2286 | "Want" : [ 2287 | { 2288 | "title" : "All I want for christmas...", 2289 | "url" : "https://perladvent.org/2005/21/" 2290 | } 2291 | ], 2292 | "Web-Machine" : [ 2293 | { 2294 | "title" : "Have REST-ful Holidays", 2295 | "url" : "https://perladvent.org/2012/2012-12-24.html" 2296 | } 2297 | ], 2298 | "Web-Query" : [ 2299 | { 2300 | "title" : "Scrape the Halls", 2301 | "url" : "https://perladvent.org/2015/2015-12-09.html" 2302 | } 2303 | ], 2304 | "WebPerl" : [ 2305 | { 2306 | "title" : "Perl in the Browser", 2307 | "url" : "https://perladvent.org/2018/2018-12-02.html" 2308 | } 2309 | ], 2310 | "WebService-FindMyiPhone" : [ 2311 | { 2312 | "title" : "Find My Santa", 2313 | "url" : "https://perladvent.org/2013/2013-12-06.html" 2314 | } 2315 | ], 2316 | "WebService-HIBP" : [ 2317 | { 2318 | "title" : "Have Elf Been Pwned?", 2319 | "url" : "https://perladvent.org/2019/2019-12-02.html" 2320 | } 2321 | ], 2322 | "Whatever" : [ 2323 | { 2324 | "title" : "So umm I told Santa what I wanted and he was totally like whatever…", 2325 | "url" : "https://perladvent.org/2010/19/" 2326 | } 2327 | ], 2328 | "Win32-GUI" : [ 2329 | { 2330 | "title" : "Seasonal Help", 2331 | "url" : "https://perladvent.org/2010/3/" 2332 | } 2333 | ], 2334 | "XLSperl" : [ 2335 | { 2336 | "title" : "Spreading Christmas Cheer", 2337 | "url" : "https://perladvent.org/2010/6/" 2338 | } 2339 | ], 2340 | "XML-Feed" : [ 2341 | { 2342 | "title" : "Feast on this", 2343 | "url" : "https://perladvent.org/2006/19/" 2344 | } 2345 | ], 2346 | "XML-Handler-AxPoint" : [ 2347 | { 2348 | "title" : "XML::Handler::AxPoint", 2349 | "url" : "https://perladvent.org/2002/8th/" 2350 | } 2351 | ], 2352 | "XML-LibXML" : [ 2353 | { 2354 | "title" : "Perl XML::LibXML by Example", 2355 | "url" : "https://grantm.github.io/perl-libxml-by-example/" 2356 | } 2357 | ], 2358 | "XML-RSS-SimpleGen" : [ 2359 | { 2360 | "title" : "On the 16th day of Advent my True Language syndicated for me...", 2361 | "url" : "https://perladvent.org/2005/16/" 2362 | }, 2363 | { 2364 | "title" : "Reindeer sausage", 2365 | "url" : "https://perladvent.org/2005/17/" 2366 | } 2367 | ], 2368 | "XML-SAX" : [ 2369 | { 2370 | "title" : "XML::SAX", 2371 | "url" : "https://perladvent.org/2002/9th/" 2372 | } 2373 | ], 2374 | "XML-Twig" : [ 2375 | { 2376 | "title" : "Santy Claus why? Why are you taking our Perl module? WHY?", 2377 | "url" : "https://perladvent.org/2009/6/" 2378 | } 2379 | ], 2380 | "YAML" : [ 2381 | { 2382 | "title" : "YAML", 2383 | "url" : "https://perladvent.org/2002/15th/" 2384 | } 2385 | ], 2386 | "YAPE-Regex-Explain" : [ 2387 | { 2388 | "title" : "Tangled Tidings", 2389 | "url" : "https://perladvent.org/2010/1/" 2390 | } 2391 | ], 2392 | "adenosine" : [ 2393 | { 2394 | "title" : "Take a little REST", 2395 | "url" : "https://perladvent.org/2012/2012-12-13.html" 2396 | } 2397 | ], 2398 | "all" : [ 2399 | { 2400 | "title" : "Let the Elves Import Your Packages", 2401 | "url" : "https://perladvent.org/2022/2022-12-14.html" 2402 | } 2403 | ], 2404 | "criticism" : [ 2405 | { 2406 | "title" : "Happy Holidays You Bastard", 2407 | "url" : "https://perladvent.org/2006/23/" 2408 | } 2409 | ], 2410 | "dbicdump" : [ 2411 | { 2412 | "title" : "Quickly Building DBIx::Class Schemas", 2413 | "url" : "https://perladvent.org/2017/2017-12-21.html" 2414 | } 2415 | ], 2416 | "feature" : [ 2417 | { 2418 | "title" : "The Perl of Christmas Future", 2419 | "url" : "https://perladvent.org/2015/2015-12-21.html" 2420 | } 2421 | ], 2422 | "forks" : [ 2423 | { 2424 | "title" : "Spoon!", 2425 | "url" : "https://perladvent.org/2007/11/" 2426 | } 2427 | ], 2428 | "iSH" : [ 2429 | { 2430 | "title" : "Christmas-iSH", 2431 | "url" : "https://perladvent.org/2018/2018-12-20.html" 2432 | } 2433 | ], 2434 | "if" : [ 2435 | { 2436 | "title" : "If if use use if", 2437 | "url" : "https://perladvent.org/2014/2014-12-12.html" 2438 | } 2439 | ], 2440 | "lazy" : [ 2441 | { 2442 | "title" : "How lazy am I?", 2443 | "url" : "https://www.olafalders.com/2018/08/21/how-lazy-am-i/" 2444 | } 2445 | ], 2446 | "local-lib" : [ 2447 | { 2448 | "title" : "Keeping the Packages Neatly Wrapped Up", 2449 | "url" : "https://perladvent.org/2011/2011-12-01.html" 2450 | } 2451 | ], 2452 | "namespace-autoclean" : [ 2453 | { 2454 | "title" : "Keep it Clean", 2455 | "url" : "https://perladvent.org/2011/2011-12-03.html" 2456 | } 2457 | ], 2458 | "pEFL" : [ 2459 | { 2460 | "title" : "A Perlmas Tree", 2461 | "url" : "https://perladvent.org/2022/2022-12-08.html" 2462 | } 2463 | ], 2464 | "pmtools" : [ 2465 | { 2466 | "title" : "Stocking Stuffers", 2467 | "url" : "https://perladvent.org/2009/16/" 2468 | } 2469 | ], 2470 | "relocatable-perl" : [ 2471 | { 2472 | "title" : "Relocatable Perl", 2473 | "url" : "https://perladvent.org/2022/2022-12-16.html" 2474 | } 2475 | ], 2476 | "rename" : [ 2477 | { 2478 | "title" : "Munge All the Filenames!", 2479 | "url" : "https://perladvent.org/2011/2011-12-18.html" 2480 | } 2481 | ], 2482 | "selfvars" : [ 2483 | { 2484 | "title" : "Selfless gifting", 2485 | "url" : "https://perladvent.org/2010/8/" 2486 | } 2487 | ], 2488 | "state" : [ 2489 | { 2490 | "title" : "The Sleigh odometer", 2491 | "url" : "https://perladvent.org/2022/2022-12-07.html" 2492 | } 2493 | ], 2494 | "utf8-all" : [ 2495 | { 2496 | "title" : "A Shortcut to Unicode", 2497 | "url" : "https://perladvent.org/2011/2011-12-21.html" 2498 | } 2499 | ] 2500 | } 2501 | -------------------------------------------------------------------------------- /tutorials.csv: -------------------------------------------------------------------------------- 1 | distribution,url,title 2 | LWP,https://lwp.interglacial.com/,Perl & LWP 3 | Data-Password-zxcvbn,https://perladvent.org/2019/2019-12-01.html,J1ngle? No...zxcvbn 4 | WebService-HIBP,https://perladvent.org/2019/2019-12-02.html,Have Elf Been Pwned? 5 | Authen-OATH,https://perladvent.org/2019/2019-12-03.html,Two Factor Elfication 6 | FFI-Platypus,https://perladvent.org/2019/2019-12-04.html,Going for Perl 7 | DarkSky-API,https://perladvent.org/2019/2019-12-06.html,The Weather Outside Is Frightful 8 | Mo,https://perladvent.org/2019/2019-12-07.html,Show Me Mo' 9 | PerlIO-gzip,https://perladvent.org/2019/2019-12-08.html,Christmas Movie Time! 10 | Test-TCP,https://perladvent.org/2019/2019-12-09.html,Command Line Browser Apps 11 | Mojo-AsyncAwait,https://perladvent.org/2019/2019-12-10.html,Awaiting Christmas 12 | Mojolicious,https://perladvent.org/2019/2019-12-11.html,Now With Added Interactivity 13 | GUIDeFATE,https://perladvent.org/2019/2019-12-12.html,Now With Added Interactivity 14 | Plack,https://perladvent.org/2019/2019-12-13.html,Draft Solution 15 | GD,https://perladvent.org/2019/2019-12-14.html,Animated GIFs 16 | AWS-Lambda-Quick,https://perladvent.org/2019/2019-12-15.html,Suddenly Serverless 17 | Paws,https://perladvent.org/2019/2019-12-16.html,Paws to Plan What Todo 18 | AWS-Lambda,https://perladvent.org/2019/2019-12-17.html,Taking the Sleigh to a CloudFront 19 | Module-CoreList,https://perladvent.org/2019/2019-12-18.html,Core Strength 20 | Memoize,https://perladvent.org/2019/2019-12-19.html,Memories of Past Lives 21 | Test2-Suite,https://perladvent.org/2019/2019-12-21.html,Test2: Test Harder (but easier) 22 | Test2-Suite,https://perladvent.org/2019/2019-12-22.html,Comparing More 23 | Test2-Harness,https://perladvent.org/2019/2019-12-23.html,Testing our Impatience 24 | Imager,https://perladvent.org/2019/2019-12-24.html,We Wish You a Meme Christmas 25 | Calendar-List,https://perladvent.org/2018/2018-12-01.html,Sign o' The Times 26 | Cpanel-JSON-XS,https://perladvent.org/2018/2018-12-03.html,REST API and the Baby 27 | B,https://perladvent.org/2018/2018-12-04.html,Christmas Quoting 28 | Data-Rmap,https://perladvent.org/2018/2018-12-05.html,Data-Rmap - Santa's deepdive in an ocean of stockings. 29 | Array-Sticky,https://perladvent.org/2018/2018-12-06.html,Sticky Delight 30 | Text-CSV-Pivot,https://perladvent.org/2018/2018-12-07.html,Convert CSV to Pivot Table 31 | DBD-MariaDB,https://perladvent.org/2018/2018-12-08.html,DBD-mysql versus DBD-MariaDB 32 | Babble,https://perladvent.org/2018/2018-12-09.html,The Fix Is In 33 | Babble,https://perladvent.org/2018/2018-12-10.html,Christmas Tree Babbles 34 | Mu,https://perladvent.org/2018/2018-12-11.html,Mu 35 | SVG,https://perladvent.org/2018/2018-12-12.html,Growing Christmas Trees 36 | Sub-Params,https://perladvent.org/2018/2018-12-13.html,Lost in legacy arguments 37 | App-ccdiff,https://perladvent.org/2018/2018-12-15.html,Spot The Difference 38 | Hash-Flatten,https://perladvent.org/2018/2018-12-16.html,Handling complex data structures 39 | OAuth-CmdLine,https://perladvent.org/2018/2018-12-17.html,Christmas Tunes! 40 | Test-Excel,https://perladvent.org/2018/2018-12-18.html,Test/Compare Your Excel 41 | Mojolicious,https://perladvent.org/2018/2018-12-19.html,Cute Christmas Animals 42 | Devel-hdb,https://perladvent.org/2018/2018-12-21.html,Debug Hard 43 | Method-ParamValidator,https://perladvent.org/2018/2018-12-22.html,Validation 44 | Context-Singleton,https://perladvent.org/2018/2018-12-23.html,Legacy code strikes again 45 | App-HTTPThis,https://perladvent.org/2018/2018-12-24.html,Watching The Perl Conference Again 46 | App-HTTPSThis,https://perladvent.org/2018/2018-12-24.html,Watching The Perl Conference Again 47 | Test-Simple,https://www.perlmonks.org/?node_id=11106010,Basic Testing Tutorial 48 | Net-AMQP-RabbitMQ,https://github.com/oylenshpeegul/RabbitMQ-Tutorial-Perl,RabbitMQ-Tutorial-Perl 49 | App-perlvars,https://www.olafalders.com/2022/02/22/finding-unused-perl-variables/,Finding Unused Perl Variables 50 | Code-TidyAll-Plugin-Test-Vars,https://www.olafalders.com/2022/02/22/finding-unused-perl-variables/,Finding Unused Perl Variables 51 | Dist-Zilla-Plugin-Test-TidyAll,https://www.olafalders.com/2022/02/22/finding-unused-perl-variables/,Finding Unused Perl Variables 52 | Perl-Critic-Policy-Variables-ProhibitUnusedVarsStricter,https://www.olafalders.com/2022/02/22/finding-unused-perl-variables/,Finding Unused Perl Variables 53 | Test-Vars,https://www.olafalders.com/2022/02/22/finding-unused-perl-variables/,Finding Unused Perl Variables 54 | Open-This,https://www.olafalders.com/2022/01/05/open-this-file-from-inside-vim/,Opening Files Quickly from Inside vim 55 | LWP-ConsoleLogger,https://www.olafalders.com/2021/12/01/observing-network-traffic-with-lwp-consolelogger-everywhere/,Observing Network Traffic with LWP::ConsoleLogger::Everywhere 56 | lazy,https://www.olafalders.com/2018/08/21/how-lazy-am-i/,How lazy am I? 57 | WWW-Mechanize,https://www.olafalders.com/2018/04/13/wwwmechanize-best-practices/,WWW::Mechanize Best Practices 58 | URI,https://www.olafalders.com/2016/07/12/dont-forget-about-uriheuristic/,Don't Forget about URI::Heuristic 59 | CLDR-Number,https://www.olafalders.com/2015/09/04/stop-writing-your-own-commify-functions/,Stop Writing Your Own Commify Functions 60 | Authen-OATH,https://lesterhightower.com/blog/posts/totp-with-perl-and-authenoath/,TOTP with Perl and Authen::OATH 61 | XML-LibXML,https://grantm.github.io/perl-libxml-by-example/,Perl XML::LibXML by Example 62 | URI-Find,https://perladvent.org/2002/1st/,URI::Find 63 | IO-AtomicFile,https://perladvent.org/2002/2nd/,IO::AtomicFile 64 | DBD-SQLite,https://perladvent.org/2002/3rd/,DBD::SQLite 65 | Test-Builder,https://perladvent.org/2002/4th/,Test::Builder 66 | Image-Size,https://perladvent.org/2002/5th/,Image::Size 67 | Devel-Size,https://perladvent.org/2002/6th/,Devel::Size 68 | File-MMagic,https://perladvent.org/2002/7th/,File::MMagic 69 | XML-Handler-AxPoint,https://perladvent.org/2002/8th/,XML::Handler::AxPoint 70 | XML-SAX,https://perladvent.org/2002/9th/,XML::SAX 71 | Params-Validate,https://perladvent.org/2002/10th/,Params::Validate 72 | File-Find-Rule,https://perladvent.org/2002/11th/,File::Find::Rule 73 | Object-Realize-Later,https://perladvent.org/2002/12th/,Object::Realize::Later 74 | Benchmark,https://perladvent.org/2002/13th/,Benchmark 75 | Test-MockObject,https://perladvent.org/2002/14th/,Test::MockObject 76 | YAML,https://perladvent.org/2002/15th/,YAML 77 | Acme-Intraweb,https://perladvent.org/2002/17th/,Acme::Intraweb 78 | CPANPLUS,https://perladvent.org/2002/18th/,CPANPLUS 79 | Inline-TT,https://perladvent.org/2002/19th/,Inline::TT 80 | Class-Data-Inheritable,https://perladvent.org/2002/20th/,Class::Data::Inheritable 81 | Tie-File,https://perladvent.org/2002/21st/,Tie::File 82 | Class-DBI,https://perladvent.org/2002/23rd/,Class::DBI 83 | Pixie,https://perladvent.org/2002/24th/,Pixie 84 | Devel-DProf,https://perladvent.org/2002/25th/,Devel::DProf 85 | CGI-Untaint,https://perladvent.org/2003/1st/,CGI::Untaint 86 | HTML-Entities,https://perladvent.org/2003/2nd/,HTML::Entities 87 | Hook-LexWrap,https://perladvent.org/2003/3rd/,Hook::LexWrap 88 | PPerl,https://perladvent.org/2003/4th/,PPerl 89 | Template-Extract,https://perladvent.org/2003/5th/,Template::Extract 90 | Mail-SpamAssassin,https://perladvent.org/2003/6th/,Mail::SpamAssassin 91 | Attribute-Handlers,https://perladvent.org/2003/7th/,Attribute::Handlers 92 | CGI-Application,https://perladvent.org/2003/8th/,CGI::Application 93 | Data-Dimensions,https://perladvent.org/2003/9th/,Data::Dimensions 94 | Test-Inline,https://perladvent.org/2003/10th/,Test::Inline 95 | File-chdir,https://perladvent.org/2003/11th/,File::chdir 96 | Class-ISA,https://perladvent.org/2003/12th/,Class::ISA 97 | Date-Parse,https://perladvent.org/2003/14th/,Date::Parse 98 | Text-Glob,https://perladvent.org/2003/15th/,Text::Glob 99 | Math-BigInt,https://perladvent.org/2003/16th/,Math::BigInt 100 | PDF-Reuse,https://perladvent.org/2003/18th/,PDF::Reuse 101 | Acme-Code-FreedomFighter,https://perladvent.org/2003/19th/,Acme::Code::FreedomFighter 102 | Regex-Common,https://perladvent.org/2003/20th/,Regex::Common 103 | Inline-Java,https://perladvent.org/2003/21st/,Inline::Java 104 | LWP-Simple,https://perladvent.org/2003/22nd/,LWP::Simple 105 | Data-Structure-Util,https://perladvent.org/2003/24th/,Data::Structure::Util 106 | PAR,https://perladvent.org/2003/25th/,PAR 107 | DateTime,https://perladvent.org/2004/1st/,DateTime 108 | Term-ANSIColor,https://perladvent.org/2004/2nd/,Term::ANSIColor 109 | Class-Accessor-Chained,https://perladvent.org/2004/3rd/,Class::Accessor::Chained 110 | String-ShellQuote,https://perladvent.org/2004/4th/,String::ShellQuote 111 | CPAN-Mini,https://perladvent.org/2004/5th/,CPAN::Mini 112 | Module-Pluggable,https://perladvent.org/2004/6th/,Module::Pluggable 113 | Term-ProgressBar,https://perladvent.org/2004/7th/,Term::ProgressBar 114 | Data-Dumper-Simple,https://perladvent.org/2004/8th/,Data::Dumper::Simple 115 | Proc-Daemon,https://perladvent.org/2004/9th/,Proc::Daemon 116 | Data-UUID,https://perladvent.org/2004/10th/,Data::UUID 117 | Encode,https://perladvent.org/2004/11th/,Encode 118 | Text-Unidecode,https://perladvent.org/2004/12th/,Text::Unidecode 119 | Devel-Trace,https://perladvent.org/2004/13th/,Devel::Trace 120 | SQL-Abstract,https://perladvent.org/2004/14th/,SQL::Abstract 121 | Archive-Extract,https://perladvent.org/2004/15th/,Archive::Extract 122 | Cache-Cache,https://perladvent.org/2004/16th/,Cache::Cache 123 | Mac-Glue,https://perladvent.org/2004/17th/,Mac::Glue 124 | Acme-Drunk,https://perladvent.org/2004/18th/,Acme::Drunk 125 | Filesys-Virtual,https://perladvent.org/2004/20th/,Filesys::Virtual 126 | Sys-Hostname,https://perladvent.org/2004/21st/,Sys::Hostname 127 | Interpolation,https://perladvent.org/2005/6/,On the ordinate(6) day of X-Mas 128 | Math-BigInt,https://perladvent.org/2005/8/,On the 8E00000000 day of Advent my True Language brought to me... 129 | CGI-Ajax,https://perladvent.org/2005/9/,Buzzword Bingo 130 | Perl6-Junction,https://perladvent.org/2005/11/,Conjunction Junction 131 | Regexp-Keep,https://perladvent.org/2005/13/,A penny saved is a penny earned 132 | HTML-Lint,https://perladvent.org/2005/14/,Keeping it clean 133 | Data-COW,https://perladvent.org/2005/15/,Data::COW 134 | XML-RSS-SimpleGen,https://perladvent.org/2005/16/,On the 16th day of Advent my True Language syndicated for me... 135 | XML-RSS-SimpleGen,https://perladvent.org/2005/17/,Reindeer sausage 136 | Regexp-Assemble,https://perladvent.org/2005/18/,O Christmas Trie! O Christmas Trie! 137 | Test-Perl-Critic,https://perladvent.org/2005/19/,Everyone loves a critic 138 | Perl-Compare,https://perladvent.org/2005/20/,Nothing compares to you 139 | Want,https://perladvent.org/2005/21/,All I want for christmas... 140 | Sort-Maker,https://perladvent.org/2005/23/,Sorting things out... 141 | Enum,https://perladvent.org/2005/24/,Three french toasts 142 | Text-FIGlet,https://perladvent.org/2005/25/,It went zip when it moved and bopped when it stopped and whirred when it stood still 143 | Devel-SmallProf,https://perladvent.org/2006/1/,Good things come in small packages 144 | File-Find-Object,https://perladvent.org/2006/2/,Peeking under the tree 145 | Treemap,https://perladvent.org/2006/3/,Data decorating the tips of a Christmas Treemap 146 | CGI-Minimal,https://perladvent.org/2006/4/,Are you naughty or nice? 147 | Module-Starter,https://perladvent.org/2006/6/,Santa's Little Helper 148 | Acme-Don-t,https://perladvent.org/2006/7/,Christmas don't be late 149 | File-SortedSeek,https://perladvent.org/2006/8/,Olly Olly Oxen Free 150 | Fatal,https://perladvent.org/2006/10/,Grandma Got Run Over by a Reindeer 151 | GD-Simple,https://perladvent.org/2006/11/,Putting Tinsel on the Tree 152 | Pod-Usage,https://perladvent.org/2006/12/,Santa makes a list and checks it twice... 153 | Shell,https://perladvent.org/2006/13/,The Nutcracker 154 | IPC-Run3,https://perladvent.org/2006/14/,Three I/O Channels Too Many Options & a Command to Run with IPC 155 | File-HomeDir,https://perladvent.org/2006/15/,I'll Be Home for Christmas 156 | Number-WithError,https://perladvent.org/2006/16/,I'm Approximating a White Christmas 157 | Logfile-Rotate,https://perladvent.org/2006/17/,Yule Log-Rolling 158 | Text-Diff,https://perladvent.org/2006/18/,What's the diff between a biscuit and a reindeer? 159 | XML-Feed,https://perladvent.org/2006/19/,Feast on this 160 | Date-Calc,https://perladvent.org/2006/20/,Counting down the days... 161 | Devel-Cover,https://perladvent.org/2006/21/,Warm Fuzzy Coverage 162 | PAR-Dist,https://perladvent.org/2006/22/,...and a PARtridge in a PAR tree 163 | criticism,https://perladvent.org/2006/23/,Happy Holidays You Bastard 164 | Data-ICal,https://perladvent.org/2007/1/,On the ... which day again?!? 165 | Parallel-Jobs,https://perladvent.org/2007/2/,Parallels parallels it's Christmas time in the city 166 | DBIx-Profile,https://perladvent.org/2007/3/,Brown paper packages tied up with string 167 | Test-Differences,https://perladvent.org/2007/4/,You don't get a belly like this drinking skim milk 168 | File-Which,https://perladvent.org/2007/5/,All I want for Christmas is Perl 5.10 169 | File-ReadBackwards,https://perladvent.org/2007/6/,He's making a list Checking it twice 170 | Math-Combinatorics,https://perladvent.org/2007/8/,Choosing the perfect secret santa 171 | Sub-Versive,https://perladvent.org/2007/9/,E.L.F. 172 | forks,https://perladvent.org/2007/11/,Spoon! 173 | DateTime-TimeZone,https://perladvent.org/2007/16/,Timely Flight Planning for a Sleigh 174 | Pod-Simple,https://perladvent.org/2007/17/,Subclassing all the way! 175 | Acme-Curses-Marquee,https://perladvent.org/2007/18/,Here we come a wascrolling 176 | B-Fathom,https://perladvent.org/2007/23/,Dickens also rates an 8 177 | Text-vCard,https://perladvent.org/2007/24/,Checking the list twice 178 | Time-Out,https://perladvent.org/2007/25/,I can hardly wait 179 | Math-Prime-TiedArray,https://perladvent.org/2008/2/,Primed for Christmas 180 | Math-BigApprox,https://perladvent.org/2008/3/,Sleighing big numbers 181 | Lingua-Ident,https://perladvent.org/2008/4/,Mais si Virginie le Père Noël existe 182 | Sub-Curry,https://perladvent.org/2008/6/,Baby it's cold outside so why don't we tuck into a curry? 183 | IPC-Filter,https://perladvent.org/2008/8/,Running in a filtered wonderland 184 | Module-ScanDeps,https://perladvent.org/2008/11/,Should I expect help with my heating bill from Santa? 185 | Tk,https://perladvent.org/2008/12/,Twelve Intrepid Ibex pulling a load of open source 186 | Text-SpellChecker,https://perladvent.org/2008/13/,For Krismash I wante a pony (pleez) 187 | Lingua-Translate,https://perladvent.org/2008/14/,L-HO-HO-HO-st in translation 188 | ForkBlock,https://perladvent.org/2008/15/,Merry forking() Christmas 189 | SelfLoader,https://perladvent.org/2008/16/,Loads of Christmas cheer 190 | Config-General,https://perladvent.org/2008/18/,The Toy-O-Matic (3000X!) 191 | App-Asciio,https://perladvent.org/2008/21/,Holiday Armadillo 192 | Regexp-Subst-Parallel,https://perladvent.org/2008/22/,Egg substitute nog 193 | Test-Perl-Critic-Progressive,https://perladvent.org/2008/23/,Resolution for next year: 1280x1024 or better 194 | Sort-Half-Maker,https://perladvent.org/2008/24/,Xmas sort of title 195 | Term-Animation,https://perladvent.org/2008/25/,Excited elfs 196 | Any-Moose-Forcefully,https://perladvent.org/2009/1/,Not a creature was stirring… 197 | Tie-CharArray,https://perladvent.org/2009/2/,New Winter Spectator Sport - Thongs & Toboggans 198 | Every,https://perladvent.org/2009/4/,Let it go let it go let it go 199 | XML-Twig,https://perladvent.org/2009/6/,Santy Claus why? Why are you taking our Perl module? WHY? 200 | pmtools,https://perladvent.org/2009/16/,Stocking Stuffers 201 | Match-Smart,https://perladvent.org/2009/19/,The children were smartly dressed in matching attire for the holidays 202 | Lvalue,https://perladvent.org/2009/24/,Noëlvalue 203 | Acme-Grep2D,https://perladvent.org/2009/25/,Finding the perfect tree topper 204 | YAPE-Regex-Explain,https://perladvent.org/2010/1/,Tangled Tidings 205 | Set-Array,https://perladvent.org/2010/2/,Setting the bar high with an array of unique gifts 206 | Win32-GUI,https://perladvent.org/2010/3/,Seasonal Help 207 | Devel-Eval,https://perladvent.org/2010/4/,Debuggin' blinken strings 208 | Champlain,https://perladvent.org/2010/5/,Merry Christmap 209 | XLSperl,https://perladvent.org/2010/6/,Spreading Christmas Cheer 210 | selfvars,https://perladvent.org/2010/8/,Selfless gifting 211 | Carp-REPL,https://perladvent.org/2010/11/,karp bożonarodzenie OR Dear Santa Please REPL 212 | App-perlzonji,https://perladvent.org/2010/12/,VAXmas 213 | Tkx,https://perladvent.org/2010/13/,Tkx Tkx Tkx… is Christmas every going to get here? 214 | Perl-MinimumVersion,https://perladvent.org/2010/14/,All I want for Christmas is something newer than 5.5.3 215 | Env-Sanctify,https://perladvent.org/2010/15/,$HOME for the holidays 216 | Net-Server,https://perladvent.org/2010/16/,Net stockings are barely servicable gift receptacles 217 | Math-Geometry-Voronoi,https://perladvent.org/2010/17/,Oh Voronoi night… 218 | Text-BarGraph,https://perladvent.org/2010/18/,On the 2nd day of Xmas Santa hits the bar pretty hard! 219 | Whatever,https://perladvent.org/2010/19/,So umm I told Santa what I wanted and he was totally like whatever… 220 | Net-Twitter-Lite,https://perladvent.org/2010/20/,Four Naughty Tweeting Birds 221 | Benchmark-Timer,https://perladvent.org/2010/21/,Robot Santa asks 'Is your code nice enough?' 222 | Digest-BubbleBabble,https://perladvent.org/2010/22/,xikoh-tomos-luhag-hycun-kupul-rulal-rudap-vysem-tacut-savyr-luxox 223 | Text-ParagraphDiff,https://perladvent.org/2010/24/,Twas the night before diffmas 224 | local-lib,https://perladvent.org/2011/2011-12-01.html,Keeping the Packages Neatly Wrapped Up 225 | App-cpanoutdated,https://perladvent.org/2011/2011-12-02.html,Keeping up with the Joneses 226 | namespace-autoclean,https://perladvent.org/2011/2011-12-03.html,Keep it Clean 227 | Carp-Always,https://perladvent.org/2011/2011-12-04.html,Warn Different 228 | Set-CrossProduct,https://perladvent.org/2011/2011-12-06.html,Make all the combinations 229 | Package-Stash,https://perladvent.org/2011/2011-12-07.html,Unwrapping the Package(::Stash) 230 | App-perlbrew,https://perladvent.org/2011/2011-12-08.html,All the perls are all lined up 231 | Data-SearchEngine,https://perladvent.org/2011/2011-12-09.html,Taming Search with Data::SearchEngine 232 | Mojo-UserAgent,https://perladvent.org/2011/2011-12-11.html,Mojolicious as a client 233 | DBIx-RunSQL,https://perladvent.org/2011/2011-12-12.html,Now I have an SQL machine gun 234 | App-Nopaste,https://perladvent.org/2011/2011-12-14.html,Don't Get Kickbanned 235 | Pod-Cpandoc,https://perladvent.org/2011/2011-12-15.html,Install Even Less 236 | Perldoc-Server,https://perladvent.org/2011/2011-12-16.html,All Your Documentation Even Offline 237 | Try-Tiny,https://perladvent.org/2011/2011-12-17.html,There is No Try 238 | rename,https://perladvent.org/2011/2011-12-18.html,Munge All the Filenames! 239 | Path-Class-Rule,https://perladvent.org/2011/2011-12-19.html,Process ALL the FILES! 240 | Test-Routine,https://perladvent.org/2011/2011-12-20.html,Revisiting Test::Routine 241 | utf8-all,https://perladvent.org/2011/2011-12-21.html,A Shortcut to Unicode 242 | DBIx-Connector,https://perladvent.org/2011/2011-12-22.html,Less Tedium More Transactions 243 | Params-Util,https://perladvent.org/2011/2011-12-23.html,It Boiled Plate So You Don't Have To! 244 | App-Uni,https://perladvent.org/2011/2011-12-24.html,Where Does He Get Those Wonderful Codepoints? 245 | Unicode-Tussle,https://perladvent.org/2011/2011-12-24.html,Where Does He Get Those Wonderful Codepoints? 246 | Path-Class,https://perladvent.org/2012/2012-12-01.html,Sweet Path::Class is Coming to Town 247 | Scope-Upper,https://perladvent.org/2012/2012-12-03.html,Sleigh Upgrade 248 | Dist-Zilla-Plugin-ReportVersions-Tiny,https://perladvent.org/2012/2012-12-04.html,Which Library Broke? 249 | Dancer,https://perladvent.org/2012/2012-12-05.html,Reindeer Games 250 | Data-Printer,https://perladvent.org/2012/2012-12-06.html,Checking Out Your Data Structures 251 | Safe,https://perladvent.org/2012/2012-12-07.html,Is your code… Safe? 252 | File-AtomicWrite,https://perladvent.org/2012/2012-12-08.html,Atomic Gift Wrapping 253 | File-ShareDir-Tarball,https://perladvent.org/2012/2012-12-10.html,The Greatest Tradition of All 254 | IO-Prompt-Tiny,https://perladvent.org/2012/2012-12-11.html,Making a list and checking it twice 255 | Test-LWP-UserAgent,https://perladvent.org/2012/2012-12-12.html,Testing networking client code using Test::LWP::UserAgent 256 | adenosine,https://perladvent.org/2012/2012-12-13.html,Take a little REST 257 | App-FatPacker,https://perladvent.org/2012/2012-12-14.html,Self-contained applications 258 | File-Flock-Tiny,https://perladvent.org/2012/2012-12-15.html,Gift Wrapping part II: Locking the Room 259 | Syntax-Collector,https://perladvent.org/2012/2012-12-16.html,Creating Your Own Perl 260 | Pinto,https://perladvent.org/2012/2012-12-17.html,Santa Has Dependencies Too 261 | AnyEvent,https://perladvent.org/2012/2012-12-18.html,Synchronous Operations are So Outdated 262 | CHI,https://perladvent.org/2012/2012-12-19.html,A Cache Present 263 | Test-Pretty,https://perladvent.org/2012/2012-12-20.html,Better Testing 264 | DBIx-Class,https://perladvent.org/2012/2012-12-21.html,Set-based DBIx::Class 265 | Wallflower,https://perladvent.org/2012/2012-12-22.html,Generate static web sites using your favorite Perl framework 266 | JSON,https://perladvent.org/2012/2012-12-23.html,Give and Receive the Right Number of Gifts 267 | Web-Machine,https://perladvent.org/2012/2012-12-24.html,Have REST-ful Holidays 268 | RDF-Trine,https://perladvent.org/2013/2013-12-01.html,Semantic Perl 269 | RDF-Query,https://perladvent.org/2013/2013-12-01.html,Semantic Perl 270 | App-Legion,https://perladvent.org/2013/2013-12-03.html,Swarm your webserver 271 | Graph-Easy,https://perladvent.org/2013/2013-12-04.html,Gift Exchanges as a Practical Example of Cyclic Directional Graphs 272 | Safe-Isa,https://perladvent.org/2013/2013-12-05.html,Playing it safe with Safe::Isa 273 | WebService-FindMyiPhone,https://perladvent.org/2013/2013-12-06.html,Find My Santa 274 | PSGI/Plack,https://perladvent.org/2013/2013-12-07.html,Web done better! 275 | App-PAUSE-CheckPerms,https://perladvent.org/2013/2013-12-08.html,The PAUSE Permissions Model 276 | Dist-Zilla-LocaleTextDomain,https://perladvent.org/2013/2013-12-09.html,Localize Your Perl Apps with this One Weird Trick 277 | CPANfile,https://perladvent.org/2013/2013-12-10.html,Give the gift of dependency clarity 278 | GitStore,https://perladvent.org/2013/2013-12-11.html,Toystore Story 279 | Devel-CompiledCalls,https://perladvent.org/2013/2013-12-12.html,Present Confusion 280 | DBIx-Introspector,https://perladvent.org/2013/2013-12-14.html,Shake those gifts and figure out what's inside! 281 | App-GitGot,https://perladvent.org/2013/2013-12-15.html,Got Git? Ask Santa to get Got! 282 | Beam-Emitter,https://perladvent.org/2013/2013-12-16.html,Advent-based Programming 283 | Time-Duration,https://perladvent.org/2013/2013-12-17.html,How many days until Christmas? 284 | Path-Tiny,https://perladvent.org/2013/2013-12-18.html,The little module that keeps on giving 285 | MooseX-StrictConstructor,https://perladvent.org/2013/2013-12-19.html,More Moose More Discipline 286 | PPI-HTML,https://perladvent.org/2013/2013-12-20.html,Pretty Pretty Pod 287 | Text-VimColor,https://perladvent.org/2013/2013-12-20.html,Pretty Pretty Pod 288 | String-Errf,https://perladvent.org/2013/2013-12-22.html,Throw Now Describe Later 289 | DateTime-Moonpig,https://perladvent.org/2013/2013-12-23.html,DateTimes 290 | Devel-cst,https://perladvent.org/2013/2013-12-24.html,The Emergency Debugger 291 | Test-TempDir-Tiny,https://perladvent.org/2014/2014-12-01.html,No Room At The I.N.N. 292 | Mac-Safari-JavaScript,https://perladvent.org/2014/2014-12-02.html,Making a list checking it twice... 293 | HTTP-Tiny,https://perladvent.org/2014/2014-12-03.html,Attention Seeking Behavior 294 | Sub-Util,https://perladvent.org/2014/2014-12-05.html,A Subroutine By Any Other Name 295 | Test-DatabaseRow,https://perladvent.org/2014/2014-12-06.html,Testing The Naughty Or Nice Database 296 | Time-Limit,https://perladvent.org/2014/2014-12-07.html,Out of Time 297 | Perl-Metrics-Simple,https://perladvent.org/2014/2014-12-08.html,The Complexity of Perl 298 | Mojo-Pg,https://perladvent.org/2014/2014-12-09.html,Async PostgreSQL with Mojo::Pg 299 | FFI-Raw,https://perladvent.org/2014/2014-12-10.html,Foreign Function Interface and Perl 300 | Type-Tiny,https://perladvent.org/2014/2014-12-11.html,A Tiny But Powerful Type System 301 | if,https://perladvent.org/2014/2014-12-12.html,If if use use if 302 | MooX-Options,https://perladvent.org/2014/2014-12-13.html,Now I Have Better Options 303 | Test-Kit,https://perladvent.org/2014/2014-12-14.html,All I want for Christmas is less boilerplate 304 | MetaCPAN-Client,https://perladvent.org/2014/2014-12-15.html,Finding CPAN distributions with github repositories 305 | Code-TidyAll,https://perladvent.org/2014/2014-12-16.html,How Santa's Elves Keep their Workshop Tidy 306 | Test-Requires,https://perladvent.org/2014/2014-12-17.html,Optional tests for optional requirements 307 | Data-ICal-DateTime,https://perladvent.org/2014/2014-12-18.html,Christmas Timekeeping 308 | Capture-Tiny,https://perladvent.org/2014/2014-12-19.html,Wrapping output 309 | Struct-Dumb,https://perladvent.org/2014/2014-12-20.html,Dumb In-struct-ions 310 | App-ack,https://perladvent.org/2014/2014-12-21.html,Beyond Grep 311 | Plack-App-Path-Router,https://perladvent.org/2014/2014-12-22.html,A Holiday PAPR-ation 312 | AnyEvent,https://perladvent.org/2014/2014-12-24.html,Out of Order Perl 313 | GeoIP2,https://perladvent.org/2015/2015-12-01.html,Where in the World? 314 | App-cpm,https://perladvent.org/2015/2015-12-02.html,Fast CPAN Module Installation 315 | Devel-Hide,https://perladvent.org/2015/2015-12-04.html,Help! Rudolf's Nose Won't Light Up! 316 | Lingua-EN-Inflexion,https://perladvent.org/2015/2015-12-05.html,Improving User Messages 317 | Convert-CookingTimes,https://perladvent.org/2015/2015-12-06.html,Calculating cooking times the easy way 318 | Text-Hogan,https://perladvent.org/2015/2015-12-07.html,Sharing templates will get you on the nice list 319 | Reply,https://perladvent.org/2015/2015-12-08.html,Live programming perl with Reply 320 | Web-Query,https://perladvent.org/2015/2015-12-09.html,Scrape the Halls 321 | Module-CPANFile,https://perladvent.org/2015/2015-12-10.html,Just What Are You Installing Now? 322 | Smart-Comments,https://perladvent.org/2015/2015-12-11.html,Extracting more value out of your script's comments 323 | Config-Station,https://perladvent.org/2015/2015-12-12.html,Configuration Station 324 | JSON-Path,https://perladvent.org/2015/2015-12-13.html,(JSON::)Paths in the snow 325 | Acme-MetaSyntactic,https://perladvent.org/2015/2015-12-14.html,crash kayo zamm splatt 326 | File-Serialize,https://perladvent.org/2015/2015-12-15.html,Garlands of YAML and JSON 327 | Stepford,https://perladvent.org/2015/2015-12-16.html,Building Santa's Naughty and Nice List with Stepford 328 | Process-Status,https://perladvent.org/2015/2015-12-17.html,No More Leaking Glue 329 | Sereal,https://perladvent.org/2015/2015-12-18.html,Christmas Wishes 330 | Sort-ByExample,https://perladvent.org/2015/2015-12-19.html,Santa Sorts By Example 331 | Redis,https://perladvent.org/2015/2015-12-20.html,Perl and Redis 332 | feature,https://perladvent.org/2015/2015-12-21.html,The Perl of Christmas Future 333 | AnsibleModule,https://perladvent.org/2015/2015-12-22.html,Automate Christmas with Ansible and Perl 334 | Mojo-UserAgent,https://perladvent.org/2015/2015-12-23.html,Escaping the Basement For Christmas 335 | Device-Chip-Adapter,https://perladvent.org/2015/2015-12-24.html,The Perl Powered Christmas Tree 336 | Meta-Grapher-Moose,https://perladvent.org/2016/2016-12-01.html,Graphing Moose Classes Automatically 337 | Ref-Util,https://perladvent.org/2016/2016-12-02.html,Jingle Refs Jingle Refs Jingle all the way 338 | Bencher,https://perladvent.org/2016/2016-12-03.html,Benchmarking with Bencher 339 | Log-Any,https://perladvent.org/2016/2016-12-04.html,Yuletide Logging 340 | List-Gather,https://perladvent.org/2016/2016-12-05.html,Gathering all the Presents 341 | Schedule-LongSteps,https://perladvent.org/2016/2016-12-06.html,Help Santa Klaus Reward Only Nice Children 342 | Git-Hooks,https://perladvent.org/2016/2016-12-07.html,Writing git hooks with Git::Hooks 343 | Geo-Coder-OpenCage,https://perladvent.org/2016/2016-12-08.html,Geocoding the world at volume with open data 344 | Params-Validate-Dependencies,https://perladvent.org/2016/2016-12-09.html,Too Many Choices For Santa 345 | CSV,https://perladvent.org/2016/2016-12-10.html,Combining wishlists for production and shipping planning 346 | Magpie,https://perladvent.org/2016/2016-12-11.html,REST-oring Christmas Tranquility 347 | Syntax-Keyord-Try,https://perladvent.org/2016/2016-12-12.html,Trying for a Happy Christmas 348 | PPI,https://perladvent.org/2016/2016-12-14.html,Using PPI for static analysis 349 | List-Util,https://perladvent.org/2016/2016-12-15.html,Making Perl Functional 350 | Geo-Parser-Text,https://perladvent.org/2016/2016-12-16.html,A Geo Parser for vast amounts of Text 351 | App-Spec,https://perladvent.org/2016/2016-12-17.html,Writing command line tools made easy 352 | Text-Fuzzy,https://perladvent.org/2016/2016-12-18.html,Warm and Fuzzy Inside 353 | Linux-Clone,https://perladvent.org/2016/2016-12-19.html,Using containers with Linux 354 | Linux-Unshare,https://perladvent.org/2016/2016-12-19.html,Using containers with Linux 355 | Linux-Setns,https://perladvent.org/2016/2016-12-19.html,Using containers with Linux 356 | PDF-Reuse,https://perladvent.org/2016/2016-12-20.html,PDF-Reuse + Reduce & Recycle 357 | Dancer-SearchApp,https://perladvent.org/2016/2016-12-21.html,Organizing catalogues and wishlists with Dancer::SearchApp 358 | Algorithm-Kmeans,https://perladvent.org/2016/2016-12-22.html,All I want for Christmas...Is Statistically Calcuable 359 | HTTP-Caching,https://perladvent.org/2016/2016-12-23.html,speeding up the inter-web 360 | Emoji-NationalFlag,https://perladvent.org/2017/2017-12-02.html,Around the world with Emoji 361 | Perl-Critic,https://perladvent.org/2017/2017-12-03.html,Context Matters 362 | Import-Into,https://perladvent.org/2017/2017-12-06.html,North Pole Safety Precautions 363 | Term-Choose,https://perladvent.org/2017/2017-12-07.html,Choices choices so many choices! 364 | Const-Fast,https://perladvent.org/2017/2017-12-08.html,Constantly Merry 365 | Eval-Closure,https://perladvent.org/2017/2017-12-10.html,Evaluating the NaughtyNice Formula 366 | Path-Tiny,https://perladvent.org/2017/2017-12-11.html,Tiny Path Handling 367 | Devel-MAT,https://perladvent.org/2017/2017-12-12.html,A Christmas Memory 368 | Unicode-UCD,https://perladvent.org/2017/2017-12-13.html,It's All There in the Numbers! 369 | Perl-PrereqScanner,https://perladvent.org/2017/2017-12-14.html,Prereqing around the Christmas Tree 370 | Mojo,https://perladvent.org/2017/2017-12-15.html,Mojolicious on the Command Line 371 | MooseX-AttributeShortcuts,https://perladvent.org/2017/2017-12-16.html,For Elves Shorter is Better 372 | MooseX-StrictConstructor,https://perladvent.org/2017/2017-12-17.html,Making a constructor argument list checking it twice. 373 | MooseX-ClassAttribute,https://perladvent.org/2017/2017-12-18.html,Project Multipli-sleigh-ion 374 | MooseX-LazyRequire,https://perladvent.org/2017/2017-12-19.html,Maybe not 375 | MooseX-UndefTolerant-Attribute,https://perladvent.org/2017/2017-12-19.html,Maybe not 376 | Reindeer,https://perladvent.org/2017/2017-12-20.html,Reindeer 377 | dbicdump,https://perladvent.org/2017/2017-12-21.html,Quickly Building DBIx::Class Schemas 378 | Params-ValidationCompiler,https://perladvent.org/2017/2017-12-23.html,Speedy Validation 379 | WWW-YouTube-Download,https://perladvent.org/2017/2017-12-24.html,Watching The Perl Conference 380 | WebPerl,https://perladvent.org/2018/2018-12-02.html,Perl in the Browser 381 | Cpanel-JSON-XS-Type,https://perladvent.org/2018/2018-12-03.html,REST API and the Baby 382 | B-perlstring,https://perladvent.org/2018/2018-12-04.html,Christmas Quoting 383 | Array-Sticky-INC,https://perladvent.org/2018/2018-12-06.html,Sticky Delight 384 | App-Sigfix,https://perladvent.org/2018/2018-12-09.html,The Fix Is In 385 | SVG-ChristmasTree,https://perladvent.org/2018/2018-12-12.html,Growing Christmas Trees 386 | OAuth-CmdLine-Spotify,https://perladvent.org/2018/2018-12-17.html,Christmas Tunes! 387 | Mojo-Promise,https://perladvent.org/2018/2018-12-19.html,Cute Christmas Animals 388 | iSH,https://perladvent.org/2018/2018-12-20.html,Christmas-iSH 389 | PerlIO-zip,https://perladvent.org/2019/2019-12-08.html,Christmas Movie Time! 390 | Net-EmptyPort,https://perladvent.org/2019/2019-12-09.html,Command Line Browser Apps 391 | Mojo-Transaction-Websocket,https://perladvent.org/2019/2019-12-11.html,Now With Added Interactivity 392 | HTTP-Message-PSGI,https://perladvent.org/2019/2019-12-13.html,Draft Solution 393 | AWS-Lambda-PSGI,https://perladvent.org/2019/2019-12-17.html,Taking the Sleigh to a CloudFront 394 | Memoize-Expire,https://perladvent.org/2019/2019-12-19.html,Memories of Past Lives 395 | Test2-V0,https://perladvent.org/2019/2019-12-21.html,Test2: Test Harder (but easier) 396 | Test2-Compare-Base,https://perladvent.org/2019/2019-12-22.html,Comparing More 397 | App-yath,https://perladvent.org/2019/2019-12-23.html,Testing our Impatience 398 | Mite,https://perladvent.org/2022/2022-12-01.html,Silent Mite 399 | MooseX-Getopt,https://perladvent.org/2022/2022-12-02.html,MooseX::Getopt saves Christmas 400 | Pithub,https://perladvent.org/2022/2022-12-03.html,Santa is on GitHub 401 | App-CGIThis,https://perladvent.org/2022/2022-12-04.html,northpole.cgi 402 | Mango,https://perladvent.org/2022/2022-12-05.html,Catching dreams 403 | Util-H2O,https://perladvent.org/2022/2022-12-06.html,St. Nick's Reindeers Need H2O! 404 | state,https://perladvent.org/2022/2022-12-07.html,The Sleigh odometer 405 | pEFL,https://perladvent.org/2022/2022-12-08.html,A Perlmas Tree 406 | Value-Diff,https://perladvent.org/2022/2022-12-09.html,What did Santa forget? 407 | Feature-Compat-Try,https://perladvent.org/2022/2022-12-10.html,The Christmas Time Machine 408 | Try-ALRM,https://perladvent.org/2022/2022-12-11.html,Wake up! Time to open presents! 409 | GraphViz2,https://perladvent.org/2022/2022-12-12.html,The Delivery Map 410 | all,https://perladvent.org/2022/2022-12-14.html,Let the Elves Import Your Packages 411 | Mojolicious-Plugin-RevealJS,https://perladvent.org/2022/2022-12-15.html,Create Professional Slideshows with Mojolicious::Plugin::RevealJS 412 | relocatable-perl,https://perladvent.org/2022/2022-12-16.html,Relocatable Perl 413 | Net-CIDR-Lite,https://perladvent.org/2022/2022-12-17.html,Naughty or Nice Networks 414 | MIME-Base64,https://perladvent.org/2022/2022-12-18.html,TWVycnkgQ2hyaXN0bWFzIDop 415 | CPAN-Audit,https://perladvent.org/2022/2022-12-19.html,Find known reported vulnerabilities in the modules you use 416 | Carton,https://perladvent.org/2022/2022-12-21.html,Lapland Packaging Department - Part 2 417 | Chart-Lines,https://perladvent.org/2022/2022-12-23.html,At the Present Factory 418 | Chart-Bars,https://perladvent.org/2022/2022-12-24.html,Looking at the Christmas Numbers 419 | Perl-Dist-APPerl,https://perladvent.org/2022/2022-12-25.html,How to wrap a camel? 420 | MIDI-Drummer-Tiny,https://ology.github.io/midi-drummer-tiny-tutorial/,MIDI Drummer Tutorial 421 | Music-Duration-Partition,https://ology.github.io/music-duration-partition-tutorial/,Music::Duration::Partition Tutorial 422 | --------------------------------------------------------------------------------