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

Good afternoon. I'm learning perl, and confused by a simple code which prints :

Arch bits : OS Arch x86_64 : i686 OS Arch bits 1 : 64 OS Arch bits: 64 Now using for/if OS Arch x86_64 : i686 OS Arch bits 1 : 64

instead of :

Arch bits : OS Arch x86_64 : i686 OS Arch bits 3 : 32 OS Arch bits: 32 Now using for/if OS Arch x86_64 : i686 OS Arch bits 3 : 32

Code is as follow :

#!/usr/bin/perl print "Arch bits : $os_arch_bits\n"; #$os_arch = `uname -m`; #$os_arch =~ s/\n//g; #$os_arch =~ s/\r//g; $os_arch = 'i686'; if ($os_arch == 'x86_64') { print "OS Arch x86_64 : $os_arch\n"; $os_arch_bits = '64'; print "OS Arch bits 1 : $os_arch_bits\n"; } elsif ($os_arch == 'i386') { print "OS Arch i386 : $os_arch\n"; $os_arch_bits = '32'; print "OS Arch bits 2 : $os_arch_bits\n"; } elsif ($os_arch == 'i686') { print "OS Arch 64 : $os_arch\n"; $os_arch_bits = '32'; print "OS Arch bits 3 : $os_arch_bits\n"; } else { print "OS Arch 64 : $os_arch\n"; $os_arch_bits = 'XX'; print "OS Arch bits 4 : $os_arch_bits\n"; } print "OS Arch bits: $os_arch_bits\n"; print "Now using for/if\n"; for ($os_arch) { if ("x86_64") { print "OS Arch x86_64 : $os_arch\n"; $os_arch_bits = '64'; print "OS Arch bits 1 : $os_arch_bits\n"; } elsif ("i386") { print "OS Arch i386 : $os_arch\n"; $os_arch_bits = '32'; print "OS Arch bits 2 : $os_arch_bits\n"; } elsif ("i686") { print "OS Arch 64 : $os_arch\n"; $os_arch_bits = '32'; print "OS Arch bits 3 : $os_arch_bits\n"; } else { print "OS Arch 64 : $os_arch\n"; $os_arch_bits = 'XX'; print "OS Arch bits 4 : $os_arch_bits\n"; } }
Help will be appreciated :)

Replies are listed 'Best First'.
Re: simple "if.. elsif.. else.." statements, trying "for.. if.." too
by toolic (Bishop) on May 18, 2012 at 12:24 UTC
    Additionally, this:
    for ($os_arch) { if ("x86_64") { print "OS Arch x86_64 : $os_arch\n"; $os_arch_bits = '64'; print "OS Arch bits 1 : $os_arch_bits\n"; }

    is the same as:

    for ($os_arch) { if (1) { # <------------------------------------------ print "OS Arch x86_64 : $os_arch\n"; $os_arch_bits = '64'; print "OS Arch bits 1 : $os_arch_bits\n"; }

    Therefore, the 1st "if" will always be true. None of the "else" clauses will be evaluated. You don't need the for loop:

    if ($os_arch eq "x86_64") { print "OS Arch x86_64 : $os_arch\n"; $os_arch_bits = '64'; print "OS Arch bits 1 : $os_arch_bits\n"; } elsif ($os_arch eq "i386") { print "OS Arch i386 : $os_arch\n"; $os_arch_bits = '32'; print "OS Arch bits 2 : $os_arch_bits\n"; } elsif ($os_arch eq "i686") { print "OS Arch 64 : $os_arch\n"; $os_arch_bits = '32'; print "OS Arch bits 3 : $os_arch_bits\n"; } else { print "OS Arch 64 : $os_arch\n"; $os_arch_bits = 'XX'; print "OS Arch bits 4 : $os_arch_bits\n"; }

    See also Switch statements

    use strict and warnings

      I usually use switch when coding in other langages. I can't find the website were I read this strange for loop. Thank you, I'll search in the switch doc.

        What you probably saw was:

        for ($os_arch) { if (/x86_64/) {

        Which is short for:

        for my $os_type ($os_arch) { if ($os_type =~ m/x86_64/) {

        I imagine you wanted this:

        for ($os_arch) { when ("x86_64") { ... } ... }

        Or:

        given ($os_arch) { when ("x86_64") { ... } ... }
        perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'
Re: simple "if.. elsif.. else.." statements, trying "for.. if.." too
by Anonymous Monk on May 18, 2012 at 12:13 UTC
    Wrong operator, see perlop. Had you enabled warnings, then Perl would alert you to your mistake.
    $os_arch eq 'x86_64'
      it works, thank you :)
Re: simple "if.. elsif.. else.." statements, trying "for.. if.." too
by LanX (Saint) on May 18, 2012 at 23:35 UTC