http://qs321.pair.com?node_id=1195793

Todd Chester has asked for the wisdom of the Perl Monks concerning the following question:

Dear Perl Monks,

In Perl 5, is there a way to name my variables in the () of the sub declaration, as I do in Perl 6?
sub DoSomething( $DataStr ) {;}

Many thanks, -T

Replies are listed 'Best First'.
Re: sub variables
by LanX (Saint) on Jul 23, 2017 at 00:06 UTC
    > In Perl 5, is there a way to name my variables in the () of the sub declaration,

    Yes newer Perl versions have an experimental new feature for signatures

    see https://www.effectiveperlprogramming.com/2015/04/use-v5-20-subroutine-signatures/

    > sub DoSomething( $DataStr ) {;}

    Yes, positional arguments are supported.

    Even with mandatory arguments or optional arguments with default values.

    > as I do in Perl 6?

    Not really.

    Perl6 allows much more, like named variables, types and constraints

    Cheers Rolf
    (addicted to the Perl Programming Language and ☆☆☆☆ :)
    Je suis Charlie!

      Thank you!
      I am on 5.16.3
      Rats!

        I wrote a simplicistic source filter to bring the subroutine signatures to almost all versions of Perl. The module is Filter::signatures.

Re: sub variables
by kevbot (Vicar) on Jul 23, 2017 at 01:06 UTC
    If you want those type of features in perl5 take a look at the Function::Parameters module.

    UPDATE: This module requires perl 5.14 or newer.

Re: sub variables
by golux (Chaplain) on Jul 23, 2017 at 01:36 UTC
    Hi Todd Chester,

    I personally like the module Method::Signatures, but tbh it's the only one I've used. I'll have to check out Function::Parameters for comparison's sake, which, judging by its date(s) looks like it may be more recent.

    say  substr+lc crypt(qw $i3 SI$),4,5
      I have a fairly large code-base that relies on Method::Signatures, and I have found that it works very well. However, it depends on Devel::Declare. The documentation for Devel::Declare states,
      WARNING Warning: Devel::Declare is a giant bag of crack originally implemented + by mst with the goal of upsetting the perl core developers so much b +y its very existence that they implemented proper keyword handling in + the core. As of perl5 version 14, this goal has been achieved, and modules such +as Devel::CallParser, Function::Parameters, and Keyword::Simple provi +de mechanisms to mangle perl syntax that don't require hallucinogenic + drugs to interpret the error messages they produce.
      So, for new code I would recommend Function::Parameters.

      Also, it looks like the author of Method::Signatures (schwern) would like for the two modules to work well together. See these github issues,

      However, these issues are a few years old and I don't know how much progress has been made in addressing them.
        Another module along this like is Toby Inkster's Kavorka, which seems very powerful.
        kevbot,

        Thank you for that info. I have noticed that there is one glitch that occurs in Method::Signatures on occasion. I like to use a func fatal($msg) subroutine in conjunction with caller, to handle fatal errors in some of my programs, and Method::Signatures causes it to sometimes misreport the line from which the error occurred, which schwern alludes to in your link about making it into a wrapper, so it's nice to finally have confirmation of this!

        In lieu of this I will try Function::Parameters with the hopes of using it as a replacement. I already like the idea of typing one less char for functions! (fun instead of func)

        say  substr+lc crypt(qw $i3 SI$),4,5
Re: sub variables
by karlgoethebier (Abbot) on Jul 23, 2017 at 12:51 UTC

    I'm a bit surprised why nobody mentioned signatures:

    #!/usr/bin/env perl # http://perlmonks.org/?node_id=1195793 # $Id: signatures.pl,v 1.3 2017/07/23 12:44:30 karl Exp karl $ use strict; use warnings; use feature qw(say); use signatures; say $^V; say nose(q(cuke)); sub nose ($cuke) { $cuke; } __END__

    But perhaps i missed the point because i don't know Perl6.

    Best regards, Karl

    «The Crux of the Biscuit is the Apostrophe»

    perl -MCrypt::CBC -E 'say Crypt::CBC->new(-key=>'kgb',-cipher=>"Blowfish")->decrypt_hex($ENV{KARL});'Help

      I'm a bit surprised why nobody mentioned signatures:

      LanX did, in the very first reply.

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
        No I didn't.

        KGB is talking about a module confusingly released under the namespace of pragmas.

        Cheers Rolf
        (addicted to the Perl Programming Language and ☆☆☆☆ :)
        Je suis Charlie!

        OK, i didn't follow the link. But please see below above...

        Best regards, Karl

        «The Crux of the Biscuit is the Apostrophe»

        perl -MCrypt::CBC -E 'say Crypt::CBC->new(-key=>'kgb',-cipher=>"Blowfish")->decrypt_hex($ENV{KARL});'Help