The reason this doesn't work is because a foreach loop localizes its variable to the loop, and you're using a lexical (my) variable, so the localized value is not available outside of the loop:

The foreach loop iterates over a normal list value and sets the scalar variable VAR to be each element of the list in turn. If the variable is preceded with the keyword my, then it is lexically scoped, and is therefore visible only within the loop. Otherwise, the variable is implicitly local to the loop and regains its former value upon exiting the loop. If the variable was previously declared with my, it uses that variable instead of the global one, but it's still localized to the loop.

It's not good practice to pass arguments to subroutines as global variables, and I strongly recommend using actual subroutine parameters instead. Also, by the way, you should check the return value of system for errors; see its docs for details - I've just included the bare minimum below.

use warnings; use strict; my @list = qw/ server1.net server2.net server3.net /; foreach my $server (@list) { command1($server); command2($server); } sub command1 { my $server = shift; print "command1 on $server\n"; system("command1")==0 or die "command1 \$?=$?"; } sub command2 { my $server = shift; print "command2 on $server\n"; system("command2")==0 or die "command2 \$?=$?"; }

Update: I missed this initially:

the problem is $server variable cannot be passed inside the subroutines

Could you explain why not?


In reply to Re: Passing the value of a global variable inside a subroutine (updated) by haukex
in thread Passing the value of a global variable inside a subroutine by sreek3502

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.