#!/usr/bin/perl # This test Perl program checks out all the different ways I could think of, # of what one gets when in scalar context versus list context. # 1) A real list: undef $myscalar; undef @mylist; @real_list = ("s1","s2"); $myscalar = @real_list; @mylist = @real_list; print "Case 1) Using a real list:\n"; print " \@real_list = (\"s1\",\"s2\");\n"; print " \$myscalar = \@real_list; yields ",(defined $myscalar)?$myscalar:"UNDEFINED","\n"; print " and \@mylist = \@real_list; yields =>",(defined $mylist[0])?$mylist[0]:"UNDEFINED","<\n"; print " =>" ,(defined $mylist[1])?$mylist[1]:"UNDEFINED","<\n"; print " and =>" ,(defined $mylist[2])?$mylist[2]:"UNDEFINED","<\n\n"; # 2) Putting ("s1","s2") on the right hand side of an assignment: undef $myscalar; undef @mylist; $myscalar = ("s1","s2"); @mylist = ("s1","s2"); print "Case 2) Using a supplied list:\n"; print " \$myscalar = (\"s1\",\"s2\"); yields $myscalar (!!) Note parenthesis in scalar context.\n"; print " and \@mylist = (\"s1\",\"s2\"); yields =>",(defined $mylist[0])?$mylist[0]:"UNDEFINED","<\n"; print " =>" ,(defined $mylist[1])?$mylist[1]:"UNDEFINED","<\n"; print " and =>" ,(defined $mylist[2])?$mylist[2]:"UNDEFINED","<\n\n"; # 3-A) Using Backticks on a Command That Returns Something: undef $myscalar; undef @mylist; $myscalar = `lsvg rootvg`; @mylist = `lsvg rootvg`; print "Case 3-A) Using backticks on a Command That Returns Something:\n"; $myscalar =~ s/\n/\n/g; $myscalar =~ s/\n$//g; print " \$myscalar = \`lsvg rootvg\'; yields one large, 10-line string\n>$myscalar<\n\n"; print " and \@mylist = \`lsvg rootvg\'; yields a 10-element list,\n"; $mylist[0] =~ s/\n$//; print "\$mylist\[ 0\] =>$mylist[0]<\n"; $mylist[1] =~ s/\n$//; print "\$mylist\[ 1\] =>$mylist[1]<\n"; $mylist[2] =~ s/\n$//; print "\$mylist\[ 2\] =>$mylist[2]<\n"; print " ...\n"; $mylist[9] =~ s/\n$//; print "\$mylist\[ 9\] =>$mylist[9]<\n"; print "\$mylist\[10\] =>" ,(defined $mylist[10])?$mylist[10]:"UNDEFINED","<\n\n"; # 3-B) Using Backticks on a Command That Returns Nothing: undef $myscalar; undef @mylist; print "1\n"; $myscalar = `lsvg rootvg >/dev/null`; print "2\n"; @mylist = `lsvg rootvg >/dev/null`; print "3\n"; print "Case 3-B) Using backticks on a Command That Returns Nothing:\n"; print "4\n"; $myscalar =~ s/\n/\n/g; print "5\n"; $myscalar =~ s/\n$//g; print "6\n"; print " \$myscalar = \`lsvg rootvg \>/dev/null\`; yields >",(defined $myscalar)?$myscalar:"UNDEFINED","< (!!) # Note null in scalar context\n"; print "7\n"; print " and \@mylist = \`lsvg rootvg \>/dev/null\`; yields =>",(defined $mylist[0])?$mylist[0]:"UNDEFINED","< # but undefined in list context.\n"; print " =>" ,(defined $mylist[1])?$mylist[1]:"UNDEFINED","<\n\n"; # 4) Using a Successful Pattern Match: undef $myscalar; undef @mylist; $myscalar = "abc" =~ /a/; @mylist = "abc" =~ /a/; print "Case 4) Using a Successful Pattern Match:\n"; print " \$myscalar = \"abc\" =~ /a/; yields $myscalar\n"; print " and \@mylist = \"abc\" =~ /a/; yields =>",(defined $mylist[0])?$mylist[0]:"UNDEFINED","<\n"; print " >" ,(defined $mylist[1])?$mylist[1]:"UNDEFINED","<\n\n"; # 5) Using an Unsuccessful Pattern Match: undef $myscalar; undef @mylist; $mylist[0] = "mytest0"; # This proves that these mylist elements $mylist[1] = "mytest1"; # actually get undefined, not merely not set. $myscalar = "abc" =~ /z/; @mylist = "abc" =~ /z/; print "Case 5) Using an Unsuccessful Pattern Match:\n"; print " \$myscalar = \"abc\" =~ /z/; yields =>",(defined $myscalar)?$myscalar:"UNDEFINED","< (!!) # Note null in scalar context,\n"; print " and \@mylist = \"abc\" =~ /z/; yields =>",(defined $mylist[0])?$mylist[0]:"UNDEFINED","< # but undefined in list context.\n"; print " =>",(defined $mylist[1])?$mylist[1]:"UNDEFINED","<\n\n"; # 6-A) Using a Successful Pattern Match on a Backtick'd Command That Returns Something: undef $myscalar; undef @mylist; $myscalar = `lsvg rootvg` =~ /PP/; @mylist = `lsvg rootvg` =~ /PP/; print "Case 6-A) Using a Successful Pattern Match on a Backtick'd Command That Returns Something:\n"; print " \$myscalar = \`lsvg rootvg\` =~ /PP/; yields =>$myscalar<\n"; print " and \@mylist = \`lsvg rootvg\` =~ /PP/; yields =>",(defined $mylist[0])?$mylist[0]:"UNDEFINED","<\n"; print " =>",(defined $mylist[1])?$mylist[1]:"UNDEFINED","<\n\n"; # 6-B) Using a Successful Pattern Match on a Backtick'd Command That Returns Nothing: undef $myscalar; undef @mylist; $myscalar = `lsvg rootvg >/dev/null` =~ /PP/; @mylist = `lsvg rootvg >/dev/null` =~ /PP/; print "Case 6-B) Using a Successful Pattern Match on a Backtick'd Command That Returns Nothing:\n"; print " \$myscalar = \`lsvg rootvg >/dev/null\` =~ /PP/; yields =>$myscalar<\n"; print " and \@mylist = \`lsvg rootvg >/dev/null\` =~ /PP/; yields =>",(defined $mylist[0])?$mylist[0]:"UNDEFINED","<\n"; print " =>",(defined $mylist[1])?$mylist[1]:"UNDEFINED","<\n\n"; # 7) Using an Unsuccessful Pattern Match on a Backtick'd Command: undef $myscalar; undef @mylist; $mylist[0] = "mytest0"; # This proves that these mylist elements $mylist[1] = "mytest1"; # actually get undefined, not merely not set. $myscalar = `lsvg rootvg` =~ /zz/; @mylist = `lsvg rootvg` =~ /zz/; print "Case 7) Using an Unsuccessful Pattern Match on a Backtick'd Command:\n"; print " \$myscalar = \`lsvg rootvg\` =~ /zz/; yields =>",(defined $myscalar)?$myscalar:"UNDEFINED","< (!!) # Note null in scalar context,\n"; print " and \@mylist = \`lsvg rootvg\` =~ /zz/; yields =>",(defined $mylist[0])?$mylist[0]:"UNDEFINED","< # but undefined in list context.\n"; print " =>",(defined $mylist[1])?$mylist[1]:"UNDEFINED","<\n\n";