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/ >> >> >> >