in reply to Finding when a feature or keyword was introduced

Perl named operators and builtin subs introduced since 5.6

NameAvailabilityExperimentalIn CORE::Enabling
pragma
Enabling
feature set
__CLASS__Since 5.40Since 5.40use feature qw( class );
__SUB__Since 5.16Since 5.16use feature qw( current_sub );5.16 and up
ADJUSTSince 5.38Since 5.40Since 5.38use feature qw( class );
allSince 5.42Since 5.42Since 5.42use feature qw( keyword_all );
anySince 5.42Since 5.42Since 5.42use feature qw( keyword_any );
blessedSince 5.36From 5.36 until 5.40use builtin qw( blessed );5.40 and up
breakFrom 5.10Since 5.16[1] until 5.38
Deprecated from 5.38 until 5.42
Since 5.16use feature qw( switch );From 5.10
up to 5.36
catchSince 5.34From 5.34 until 5.40Since 5.34use feature qw( try );5.40 and up
ceilSince 5.36From 5.36 until 5.40use builtin qw( ceil );5.40 and up
classSince 5.38Since 5.38Since 5.38use feature qw( class );
continueFrom 5.10Since 5.16[1] until 5.38
Deprecated from 5.38 until 5.42
Since 5.16use feature qw( switch );From 5.10
up to 5.36
created_as_numberSince 5.36Since 5.36use builtin qw( created_as_number );
created_as_stringSince 5.36Since 5.36use builtin qw( created_as_string );
defaultFrom 5.10Since 5.16[1] until 5.38
Deprecated from 5.38 until 5.42
Since 5.16use feature qw( switch );From 5.10
up to 5.36
deferSince 5.36Since 5.36Since 5.36use feature qw( defer );5.40 and up
export_lexicallySince 5.38Since 5.38use builtin qw( export_lexically );
falseSince 5.36From 5.36 until 5.40use builtin qw( false );
fc Since 5.16Since 5.16use feature qw( fc );5.16 and up
fieldSince 5.38Since 5.38Since 5.38use feature qw( class );
floorSince 5.36From 5.36 until 5.40use builtin qw( floor );5.40 and up
finallySince 5.36Since 5.36Since 5.36use feature qw( try );5.40 and up
givenFrom 5.10Since 5.16[1] until 5.38
Deprecated from 5.38 until 5.42
Since 5.16use feature qw( switch );From 5.10
up to 5.36
indexedSince 5.36From 5.36 until 5.40use builtin qw( indexed );5.40 and up
infSince 5.40Since 5.40use builtin qw( inf );
is_boolSince 5.36Since 5.36use builtin qw( is_bool );
is_taintedSince 5.38From 5.38 until 5.40use builtin qw( is_tainted );5.40 and up
is_weakSince 5.36From 5.36 until 5.40use builtin qw( is_weak );5.40 and up
isaSince 5.32From 5.32 until 5.34Since 5.32use feature qw( isa );5.36 and up
load_moduleSince 5.40Since 5.40use builtin qw( load_module );
methodSince 5.38Since 5.38Since 5.38use feature qw( class );
nanSince 5.40Since 5.40use builtin qw( nan );
refaddrSince 5.36From 5.36 until 5.40use builtin qw( refaddr );5.40 and up
reftypeSince 5.36From 5.36 until 5.40use builtin qw( reftype );5.40 and up
saySince 5.10Since 5.16use feature qw( say );5.10 and up
stateSince 5.10Since 5.16use feature qw( state );5.10 and up
stringifySince 5.40Since 5.40use builtin qw( stringify );
trimSince 5.36From 5.36 until 5.40use builtin qw( trim );5.40 and up
trueSince 5.36From 5.36 until 5.40use builtin qw( true );5.40 and up
trySince 5.34From 5.34 until 5.40Since 5.34use feature qw( try );5.40 and up
unweakenSince 5.36From 5.36 until 5.40use builtin qw( unweaken );5.40 and up
weakenSince 5.36From 5.36 until 5.40use builtin qw( weaken );5.40 and up
whenFrom 5.10Since 5.16[1] until 5.38
Deprecated from 5.38 until 5.42
Since 5.16use feature qw( switch );From 5.10
up to 5.36
 
builtin::blessedSince 5.36From 5.36 until 5.40Always available
builtin::ceilSince 5.36From 5.36 until 5.40Always available
builtin::created_as_numberSince 5.36Since 5.36Always available
builtin::created_as_stringSince 5.36Since 5.36Always available
builtin::export_lexicallySince 5.38Since 5.38Always available
builtin::falseSince 5.36From 5.36 until 5.40Always available
builtin::floorSince 5.36From 5.36 until 5.40Always available
builtin::indexedSince 5.36From 5.36 until 5.40Always available
builtin::infSince 5.40Since 5.40Always available
builtin::is_boolSince 5.36Since 5.36Always available
builtin::is_taintedSince 5.38From 5.38 until 5.40Always available
builtin::is_weakSince 5.36From 5.36 until 5.40Always available
builtin::load_moduleSince 5.40Since 5.40Always available
builtin::nanSince 5.40Since 5.40Always available
builtin::refaddrSince 5.36From 5.36 until 5.40Always available
builtin::reftypeSince 5.36From 5.36 until 5.40Always available
builtin::stringifySince 5.40Since 5.40Always available
builtin::trimSince 5.36From 5.36 until 5.40Always available
builtin::trueSince 5.36From 5.36 until 5.40Always available
builtin::unweakenSince 5.36From 5.36 until 5.40Always available
builtin::weakenSince 5.36From 5.36 until 5.40Always available
 
utf8::decodeSince 5.8Always available
utf8::downgradeSince 5.8Always available
utf8::encodeSince 5.8Always available
utf8::is_utf8Since 5.8.1Always available
utf8::native_to_unicodeSince 5.8[2]Always available
utf8::unicode_to_nativeSince 5.8[2]Always available
utf8::upgradeSince 5.8Always available
utf8::validSince 5.8Always available

Notes

Footnotes

  1. Experimental warnings were only added in 5.18, but the switch feature was documented to be experimental since 5.16.
  2. While utf8::native_to_unicode and utf8::unicode_to_native have only been documented since 5.22, they've been available since 5.8.

Updates

  1. Added the keywords from the class feature.
  2. Fixed versions for defer.
  3. Fixed versions for finally.
  4. Added availability in CORE::.
  5. is_tainted, export_lexically, builtin::is_tainted and builtin::export_lexically were missing.
  6. Updated for 5.40.
  7. Updated for 5.42.

Replies are listed 'Best First'.
Re: Perl named operator and builtin subs introduced since 5.6
by tobyink (Canon) on Sep 27, 2023 at 08:04 UTC

    Good table, but maybe it doesn't need to list everything from builtin twice? Better to just make a note that they can always be used by their fully-qualified name or imported lexically.

Re: Perl named operator and builtin subs introduced since 5.6
by kcott (Archbishop) on Sep 27, 2023 at 10:51 UTC

      I've mistakenly said the feature became experimental in 5.18 in the past too. But while the experimental warnings were added in 5.18, it was flagged as experimental in 5.16.

      Quote 5.16's perlsyn,

      you can say use feature "switch"; to enable an experimental switch feature.

      Also,

      Under the "switch" feature, Perl gains the experimental keywords given, when, default, continue, and break.

      Added break, default and continue to the table.

        ++ I never knew that — you learn something every day. Thanks for the info. :-)

        — Ken

Re: Perl named operator and builtin subs introduced since 5.6
by Bod (Parson) on Sep 27, 2023 at 14:14 UTC

    Great table - thanks :)

    I would have expected to see class in there as that's new in 5.36 isn't it? I've not used it or investigated it as 5.32 is the latest version I have.

      I would have expected to see class in there as that's new in 5.36 isn't it?

      Good point. I just checked perlclass, and I see keywords: class, field and method. Not sure if attributes :isa and :param qualify.

      5.38. Overlooked. Fixed. Thanks.

Re: Perl named operators and builtin subs introduced since 5.6
by ikegami (Patriarch) on Aug 03, 2025 at 17:35 UTC

    Updated parent for 5.42.

Re: Perl named operators and builtin subs introduced since 5.6
by freonpsandoz (Beadle) on Apr 15, 2025 at 22:56 UTC

    Great table, thanks! Is there any way to find out when features other than keywords were added? I'm currently trying to find (1) when ref() began returning 'Regexp' and (2) when class 'Regexp' was added, if that was more recent than (1). Both ref() and Scalar::Util::blessed() return 'Regexp' as of v5.20.2. The referenced 5.38 delta page contains a link to select earlier versions, but it doesn't seem to work; a "raptor not found" error is displayed.

      I collect some non-features in Syntax::Construct, but Regexp is not one of them (I might add it, though).

      map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]

      A quick perusal through the docs for ref for historical versions of Perl suggests that the Regexp class started being reported in 5.8.9 but this is not mentioned in the 5.8.9 delta AFAICS. Nowadays that really ought to be so long ago that it doesn't matter anyway.


      🦛

      It's been that way since at least 5.8.9. ("t" means threaded. Ignore that.)

      $ for v in 5.8.9 5.10t 5.12t 5.14t 5.16t 5.18t 5.20t; do echo $v $v/bin/perl -le'print ref( qr/x/ )' done 5.8.9 Regexp 5.10t Regexp 5.12t Regexp 5.14t Regexp 5.16t Regexp 5.18t Regexp 5.20t Regexp