1 package Module::CoreList::Utils;
7 our $VERSION = '5.20190920';
12 $perl = shift if eval { $perl->isa(__PACKAGE__) };
13 return unless $perl or exists $utilities{$perl};
14 return sort keys %{ $utilities{$perl} };
17 sub _released_order { # Sort helper, to make '?' sort after everything else
18 (substr($Module::CoreList::released{$a}, 0, 1) eq "?")
19 ? ((substr($Module::CoreList::released{$b}, 0, 1) eq "?")
22 : ((substr($Module::CoreList::released{$b}, 0, 1) eq "?")
24 : $Module::CoreList::released{$a} cmp $Module::CoreList::released{$b} )
27 sub first_release_raw {
29 $util = shift if eval { $util->isa(__PACKAGE__) };
30 #and scalar @_ and $_[0] =~ m#\A[a-zA-Z_][0-9a-zA-Z_]*(?:(::|')[0-9a-zA-Z_]+)*\z#;
34 ? grep { exists $utilities{$_}{ $util } &&
35 $utilities{$_}{ $util } ge $version } keys %utilities
36 : grep { exists $utilities{$_}{ $util } } keys %utilities;
38 return grep { exists $Module::CoreList::released{$_} } @perls;
41 sub first_release_by_date {
42 my @perls = &first_release_raw;
44 return (sort _released_order @perls)[0];
48 my @perls = &first_release_raw;
50 return (sort { $a cmp $b } @perls)[0];
54 my @perls = &removed_raw;
58 sub removed_from_by_date {
59 my @perls = sort _released_order &removed_raw;
65 $util = shift if eval { $util->isa(__PACKAGE__) };
66 return unless my @perls = sort { $a cmp $b } first_release_raw($util);
67 @perls = grep { exists $Module::CoreList::released{$_} } @perls;
68 my $last = pop @perls;
69 my @removed = grep { $_ > $last } sort { $a cmp $b } keys %utilities;
123 delta_from => 5.00307,
132 delta_from => 5.00405,
157 delta_from => 5.00504,
178 delta_from => 5.006002,
190 delta_from => 5.007003,
209 delta_from => 5.008009,
220 delta_from => 5.008001,
228 delta_from => 5.006001,
236 delta_from => 5.008002,
246 delta_from => 5.00503,
264 delta_from => 5.008003,
272 delta_from => 5.008004,
280 delta_from => 5.008005,
288 delta_from => 5.009001,
297 delta_from => 5.008006,
305 delta_from => 5.009002,
316 delta_from => 5.008007,
324 delta_from => 5.009003,
326 'config_data' => '1',
333 delta_from => 5.009004,
337 'cpanp-run-perl' => '1',
345 delta_from => 5.009005,
353 delta_from => 5.008008,
362 delta_from => 5.010000,
370 delta_from => 5.010001,
386 delta_from => 5.011001,
395 delta_from => 5.011002,
403 delta_from => 5.011003,
411 delta_from => 5.011004,
419 delta_from => 5.011005,
427 delta_from => 5.012005,
451 delta_from => 5.013001,
459 delta_from => 5.013002,
467 delta_from => 5.013003,
475 delta_from => 5.012001,
483 delta_from => 5.013004,
491 delta_from => 5.013005,
499 delta_from => 5.013006,
508 delta_from => 5.013007,
516 delta_from => 5.013008,
525 delta_from => 5.012002,
533 delta_from => 5.013009,
541 delta_from => 5.013010,
549 delta_from => 5.013011,
565 delta_from => 5.014004,
574 delta_from => 5.012003,
590 delta_from => 5.015001,
598 delta_from => 5.015002,
606 delta_from => 5.014001,
614 delta_from => 5.015003,
622 delta_from => 5.015004,
630 delta_from => 5.015005,
639 delta_from => 5.015006,
647 delta_from => 5.015007,
655 delta_from => 5.015008,
663 delta_from => 5.015009,
671 delta_from => 5.016003,
687 delta_from => 5.017001,
703 delta_from => 5.017002,
711 delta_from => 5.017003,
719 delta_from => 5.014002,
727 delta_from => 5.017004,
735 delta_from => 5.016001,
743 delta_from => 5.012004,
751 delta_from => 5.017005,
759 delta_from => 5.017006,
767 delta_from => 5.017007,
775 delta_from => 5.017008,
783 delta_from => 5.014003,
791 delta_from => 5.016002,
799 delta_from => 5.017009,
807 delta_from => 5.017010,
814 delta_from => 5.017011,
821 delta_from => 5.018000,
828 delta_from => 5.018001,
835 delta_from => 5.018000,
842 delta_from => 5.018000,
849 delta_from => 5.018000,
855 'cpanp-run-perl' => '1',
860 delta_from => 5.019000,
867 delta_from => 5.019001,
874 delta_from => 5.019002,
881 delta_from => 5.019003,
888 delta_from => 5.019004,
895 delta_from => 5.019005,
902 delta_from => 5.019006,
909 delta_from => 5.019007,
916 delta_from => 5.019008,
923 delta_from => 5.019009,
930 delta_from => 5.019010,
937 delta_from => 5.019011,
944 delta_from => 5.020000,
951 delta_from => 5.021000,
963 delta_from => 5.021001,
970 delta_from => 5.021002,
984 delta_from => 5.021003,
991 delta_from => 5.021004,
998 delta_from => 5.021005,
1005 delta_from => 5.021006,
1012 delta_from => 5.021007,
1019 delta_from => 5.020001,
1026 delta_from => 5.021008,
1034 delta_from => 5.021009,
1041 delta_from => 5.02101,
1048 delta_from => 5.021011,
1055 delta_from => 5.022000,
1062 delta_from => 5.023,
1069 delta_from => 5.023001,
1076 delta_from => 5.020002,
1083 delta_from => 5.023002,
1090 delta_from => 5.023003,
1097 delta_from => 5.023004,
1104 delta_from => 5.022,
1111 delta_from => 5.023005,
1118 delta_from => 5.023006,
1125 delta_from => 5.023007,
1132 delta_from => 5.023008,
1139 delta_from => 5.022001,
1146 delta_from => 5.023009,
1153 delta_from => 5.024000,
1160 delta_from => 5.025000,
1167 delta_from => 5.025001,
1174 delta_from => 5.025002,
1181 delta_from => 5.025003,
1188 delta_from => 5.025004,
1195 delta_from => 5.025005,
1202 delta_from => 5.025006,
1209 delta_from => 5.025007,
1216 delta_from => 5.022002,
1223 delta_from => 5.024000,
1230 delta_from => 5.025008,
1239 delta_from => 5.025009,
1246 delta_from => 5.025010,
1253 delta_from => 5.025011,
1260 delta_from => 5.025012,
1267 delta_from => 5.026000,
1274 delta_from => 5.027000,
1281 delta_from => 5.022003,
1288 delta_from => 5.024001,
1295 delta_from => 5.027001,
1302 delta_from => 5.027002,
1309 delta_from => 5.027003,
1316 delta_from => 5.024002,
1323 delta_from => 5.026000,
1330 delta_from => 5.027004,
1337 delta_from => 5.027005,
1344 delta_from => 5.027006,
1351 delta_from => 5.027007,
1358 delta_from => 5.027008,
1365 delta_from => 5.027009,
1372 delta_from => 5.024003,
1379 delta_from => 5.026001,
1386 delta_from => 5.027010,
1393 delta_from => 5.027011,
1400 delta_from => 5.028,
1407 delta_from => 5.029000,
1414 delta_from => 5.029001,
1421 delta_from => 5.029002,
1428 delta_from => 5.029003,
1435 delta_from => 5.029004,
1442 delta_from => 5.026002,
1449 delta_from => 5.028000,
1456 delta_from => 5.029005,
1463 delta_from => 5.029006,
1470 delta_from => 5.029007,
1477 delta_from => 5.029008,
1484 delta_from => 5.028001,
1491 delta_from => 5.029009,
1498 delta_from => 5.029010,
1512 delta_from => 5.031,
1520 delta_from => 5.031001,
1527 delta_from => 5.031002,
1534 delta_from => 5.031003,
1542 %utilities = Module::CoreList::_undelta(\%delta);
1544 # Create aliases with trailing zeros for $] use
1546 $utilities{'5.000'} = $utilities{5};
1548 _create_aliases(\%utilities);
1550 sub _create_aliases {
1553 for my $version (keys %$hash) {
1554 next unless $version >= 5.010;
1556 my $padded = sprintf "%0.6f", $version;
1558 # If the version in string form isn't the same as the numeric version,
1560 if ($padded ne $version && $version == $padded) {
1561 $hash->{$padded} = $hash->{$version};
1572 Module::CoreList::Utils - what utilities shipped with versions of perl
1576 use Module::CoreList::Utils;
1578 print $Module::CoreList::Utils::utilities{5.009003}{ptar}; # prints 1
1580 print Module::CoreList::Utils->first_release('corelist');
1583 print Module::CoreList::Utils->first_release_by_date('corelist');
1588 Module::CoreList::Utils provides information on which core and dual-life utilities shipped
1589 with each version of L<perl>.
1591 It provides a number of mechanisms for querying this information.
1593 There is a functional programming API available for programmers to query
1596 Programmers may also query the contained hash structure to find relevant
1599 =head1 FUNCTIONS API
1601 These are the functions that are available, they may either be called as functions or class methods:
1603 Module::CoreList::Utils::first_release('corelist'); # as a function
1605 Module::CoreList::Utils->first_release('corelist'); # class method
1611 Requires a perl version as an argument, returns a list of utilities that shipped with
1612 that version of perl, or undef/empty list if that perl doesn't exist.
1614 =item C<first_release( UTILITY )>
1616 Requires a UTILITY name as an argument, returns the perl version when that utility first
1617 appeared in core as ordered by perl version number or undef ( in scalar context )
1618 or an empty list ( in list context ) if that utility is not in core.
1620 =item C<first_release_by_date( UTILITY )>
1622 Requires a UTILITY name as an argument, returns the perl version when that utility first
1623 appeared in core as ordered by release date or undef ( in scalar context )
1624 or an empty list ( in list context ) if that utility is not in core.
1626 =item C<removed_from( UTILITY )>
1628 Takes a UTILITY name as an argument, returns the first perl version where that utility
1629 was removed from core. Returns undef if the given utility was never in core or remains
1632 =item C<removed_from_by_date( UTILITY )>
1634 Takes a UTILITY name as an argument, returns the first perl version by release date where that
1635 utility was removed from core. Returns undef if the given utility was never in core or remains
1640 =head1 DATA STRUCTURES
1642 These are the hash data structures that are available:
1646 =item C<%Module::CoreList::Utils::utilities>
1648 A hash of hashes that is keyed on perl version as indicated
1649 in $]. The second level hash is utility / defined pairs.
1655 Chris C<BinGOs> Williams <chris@bingosnet.co.uk>
1657 Currently maintained by the perl 5 porters E<lt>perl5-porters@perl.orgE<gt>.
1659 This module is the result of archaeology undertaken during QA Hackathon
1660 in Lancaster, April 2013.
1664 Copyright (C) 2013 Chris Williams. All Rights Reserved.
1666 This module is free software; you can redistribute it and/or modify it
1667 under the same terms as Perl itself.
1671 L<corelist>, L<Module::CoreList>, L<perl>, L<http://perlpunks.de/corelist>