On Sat, Jan 13, 2024 at 12:41 PM Andrew Solomon <and...@geekuni.com> wrote:

> > when is an array in perl declared with [] instead of ()?
>
> Using the [ ] delimiters you are creating a *reference* to an array.
> (Think of a reference as the memory address where the array is stored). So
>
> my $foo = [1,2,3];
>
> is equivalent to the following, because given an array the \ gets the
> reference to that array:
>
> my @bar = (1,2,3);
> my $foo = \@bar;
>
>
> > why aren't arrays created the same way when being passed as parameters
> to functions (when signatures are being used)?
>
> The signatures aren't doing much other than automatically assigning parts
> of @_ to variables declared in the signature.
> (For more detail, see
> https://www.effectiveperlprogramming.com/2015/04/use-v5-20-subroutine-signatures/
> )
>
> In the code you provided:
>
> sub reply_multi ( $xmpp_o, $rcpts, $msg ) {
>
> the argument $rcpts is expected to be a *reference* to an array, rather
> than an array. It's a reference because in this line:
>
>     foreach my $rcpt (@$rcpts) {
>
> @$rcpts is "dereferencing" to get the array.
>
> > Parentheses should take precendence, shouldn't they?
>
> They don't. The array is flattened into the list of arguments which means
> that:
>
> reply_multi( \$daemon{xmpp_o}, \($adminuser{fromJID}, $fromJID), "blah" );
>
> becomes
>
> reply_multi( \$daemon{xmpp_o}, \$adminuser{fromJID}, \$fromJID, "blah" );
>
> resulting in the error:
>
> "Too many arguments for subroutine 'main::reply_multi' (got 4; expected
> 3)".
>
> A
>

You can see what Andrew is pointing out by using Data::Dumper:

use Data::Dumper;
sub reply_multi
{
   print Dumper(@_);
   return;
}

my %daemon = ( xmpp_o=>2 );
my %adminuser = ( fromJID=>3 );
my $fromJID=6;

reply_multi( \$daemon{xmpp_o}, \($adminuser{fromJID}, $fromJID), "blah" );
reply_multi( \$daemon{xmpp_o}, [$adminuser{fromJID}, $fromJID], "blah" );

Resulting in:
First Call

$VAR1 = \2;
$VAR2 = \3;
$VAR3 = \6;
$VAR4 = 'blah';

Second Call

$VAR1 = \2;
$VAR2 = [
          3,
          6
        ];
$VAR3 = 'blah';


On Sat, Jan 13, 2024 at 5:03 PM hw <h...@adminart.net> wrote:
>
>>  On Sat, 2024-01-13 at 15:00 +0000, Andrew Solomon wrote:
>> > I think the line:
>> >
>> > reply_multi( \$daemon{xmpp_o}, \($adminuser{fromJID}, $fromJID), "blah"
>> );
>> >
>> > should have \(...) replaced with [ ... ] :
>> >
>> > reply_multi( \$daemon{xmpp_o}, [$adminuser{fromJID}, $fromJID], "blah"
>> );
>> >
>> > because
>> >
>> > \('foo', 'bar')
>> >
>> > evaluates to
>> >
>> > (\'foo', \'bar')
>> >
>> > Does that clarify this for you?
>>
>> Not really ...  I vaguely thought that [] might do the trick, but
>> since when is an array in perl declared with [] instead of ()?  You
>> can also do
>>
>>
>> foreach my $foo ('bar', 'baz') {
>>   print "$foo\n";
>> }
>>
>>
>> since foreach takes arrays.  So why aren't arrays created the same way
>> when being passed as parameters to functions (when signatures are
>> being used)?
>>
>> Somehow I don't remember what [] exactly do there :/  If that's like
>>
>>
>> foreach my $foo (@['bar', 'baz'])
>>
>>
>> I'd guess I remember correctly and it would kinda make sense ...
>>
>> But still ...  Parentheses should take precendence, shouldn't they?
>>
>>
>> > Andrew
>> >
>> > On Sat, Jan 13, 2024 at 2:51 PM hw <h...@adminart.net> wrote:
>> >
>> > > Hi,
>> > >
>> > > how do I pass an array that is created on the fly as one parameter of
>> > > a function?
>> > >
>> > > Example:
>> > >
>> > >
>> > > use feature 'signatures';
>> > > no warnings 'experimental::signatures';
>> > >
>> > > sub reply_multi ( $xmpp_o, $rcpts, $msg ) {
>> > >     foreach my $rcpt (@$rcpts) {
>> > >         $$xmpp_o->MessageSend( type => 'chat', to => $rcpt, body =>
>> $msg );
>> > >     }
>> > >
>> > >     return;
>> > > }
>> > >
>> > > reply_multi( \$daemon{xmpp_o}, \($adminuser{fromJID}, $fromJID),
>> "blah" );
>> > >
>> > >
>> > > This gives me an error at runtime: "Too many arguments for subroutine
>> > > 'main::reply_multi' (got 4; expected 3)".
>> > >
>> > > Yeah, sure, ok, but is that even right?  Or is signatures too
>> > > experimental to handel that yet?  Or how do I do what I want here?
>> > >
>> > >
>> > > --
>> > > To unsubscribe, e-mail: beginners-unsubscr...@perl.org
>> > > For additional commands, e-mail: beginners-h...@perl.org
>> > > http://learn.perl.org/
>> > >
>> > >
>> > >
>>
>>
>>
>>
>> --
>> To unsubscribe, e-mail: beginners-unsubscr...@perl.org
>> For additional commands, e-mail: beginners-h...@perl.org
>> http://learn.perl.org/
>>
>>
>>
>

Reply via email to