290 likes | 336 Views
Programming Language Concepts Perl Scalar Data. Adapted by Carl Reynolds from materials by Sean P. Strout. What is Scalar Data. Scalar means “one of something” Number – 255 or 3.25e20 String – hello Singular vs. plural Numbers and strings are interchangeable
E N D
Programming Language ConceptsPerl Scalar Data Adapted by Carl Reynolds from materials by Sean P. Strout PLC - Perl Scalar Data (v2)
What is Scalar Data • Scalar means “one of something” • Number – 255 or 3.25e20 • String – hello • Singular vs. plural • Numbers and strings are interchangeable • A string is a sequence of characters, but Perl treats it as a single scalar value. PLC - Perl Scalar Data (v2)
Numbers • Internally, Perl computes with double-precision floating-point values • The perl interpreter is (typically) compiled in C • Most modern systems provide for 15 digits of precision in the range of 1e-100 to 1e100 • There are no integer values visible to the programmer • “A literal is the way a value is represented in the source code of the Perl program. A literal is not the result of a calculation or an I/O operation; it’s data written directly to the source code” PLC - Perl Scalar Data (v2)
Floating Point Literals 1.25 255.000 255.0 7.25e45 # 7.25 times 10 to the 45th power -6.5e24 # negative 6.5 times 10 to the 24th -12e-24 # negative 12 times to the the –24th -1.2E-23 # same as the previous PLC - Perl Scalar Data (v2)
Integer Literals 0 2001 -40 255 61298040283768 61_298_040_283_768 # same as previous PLC - Perl Scalar Data (v2)
Non-decimal Integer Literals • These three values are all the same 0377 # 377 octal, or 255 decimal 0xff # FF hex, or 255 decimal 0b11111111 # 255 decimal (perl v5.6+) • Underscores help with readability 0x13770c77 0x1377_0c77 # same as previous (perl v5.6+) PLC - Perl Scalar Data (v2)
Numeric Operators 2 + 3 # 2 plus 3, or 5 5.1 – 2.4 # 5.1 minus 2.4, or 2.7 3 * 12 # 3 times 12 = 36 14 / 2 # 14 divided by 2, or 7 10.2 / 0.3 # 10.2 divided by 0.3, or 34 10 / 3 # 3.33333… 10 % 3 # 10 modulus 3, or 1 10.5 % 3.2 # 10 % 3, or 1 2 ** 3 # 2 to the power of 3, or 8 PLC - Perl Scalar Data (v2)
Strings • Strings are a sequence of zero or more characters • Shortest string is the empty string • Largest string fills all available memory • “Know thy ASCII table” • \75\110\111\119\32\116\104\121\32\65\83\67\73\73\32\116\97\98\108\101 • Perl can handle non printable characters in a string (values outside ASCII 32-126) • This is perfect for manipulating raw binary data like a JPEG or a compiled program PLC - Perl Scalar Data (v2)
Single-Quoted String Literals • A sequence of characters enclosed in a single quote • Any character besides a single quote, ’ , and a backslash, \ , stands for itself ’fred’ # the four characters: f, r, e, d ’’ # the null string ’Don\’t let an apostrophe end this string!’ ’The last char is a backslash: \\’ ’hello\n’ # hello, backslash, n ’hello there’ # hello, newline, there (11 chars) ’\’\\’ # single quote, backslash PLC - Perl Scalar Data (v2)
Double-Quoted String Literals • A sequence of characters enclosed in double quotes • Backslash now takes on the full power to specify a control character, or any character “barney” # same as ‘barney’ “hello world\n” # hello world, and a newline “The last character is a quote: \”” “coke\tsprite” # coke, a tab, and a sprite PLC - Perl Scalar Data (v2)
Double-quoted String Backslash Escapes ConstructMeaning \n Newline \r Return \t Tab \f Formfeed \b Backspace \a Bell \e Escape (ASCII escape character) \007 Any octal value (here 007=bell) \0x7f Any hex ASCII value (here 7f=delete) \cC A control character (here, Ctrl-C) \\ Backslash \” Double quote \l Lowercase next letter \L Lowercase all following letters until \E \u Uppercase next letter \U Uppercase all following letters until \E \Q Quote non-word chars by adding a backslash until \E \E Terminate \L, \U or \Q PLC - Perl Scalar Data (v2)
String Operators • Strings values can be concatenated with the . operator • Neither string is modified, a new result is formed “hello” . “world” # same as “helloworld” “hello” . ’ ’ . “world” # same as “hello world” ’hello world!’ . “\n” # same as “hello world!\n” • The string repetition operator, x “fred” x 3 # is “fredfredfred” “barney” x (1+1) # “barneybarney” 5 x 4 # What is this??? PLC - Perl Scalar Data (v2)
Automatic Conversion • Perl automatically converts numbers strings based on the operators. “12” * “3” “12fred34” * “ 3” “fred” * 10 “Z” . 5 * 7 • Perl can notify you of suspicious code with: % perl –w my_program • or: #!/usr/bin/perl -w PLC - Perl Scalar Data (v2)
Scalar Variables • A variable is a name for a container that holds one or more values • Scalar variables hold a single scalar value whose value can change throughout execution of the program $my_cool_scalar_variable_that_ends_in_1 All scalar variables begins with the dollar sign symbol The remainder is the perl identifier, which is a letter or underscore, followed by letters, digits or more underscores. PLC - Perl Scalar Data (v2)
Scalar Assignment • Scalar assignment gives a value to a scalar variable $fred = 17 # $fred can legally drink in 4 short years $barney = ’hello’ # give $barney the 5 character string ’hello’ $barney = $fred + 3 # $barney now holds the value 20 $barney = $barney * 2 # $barney now holds the value 40 $barney = fred + 65 # be careful! • Binary Assignment Operators $fred += 5; # $fred = $fred + 5 $barney *= 3; # $barney = $barney * 3 $str .= “ “; # $str = $str . “ “ $fred **= 3; # $fred = $fred ** 3 PLC - Perl Scalar Data (v2)
Output With print • The print operator can take a scalar argument and print it to standard output, without embellishment print “hello world\n”; print “The answer is ”; print 6 * 7; print “.\n”; print “The answer is ”, 6 * 7, “.\n”; As you can imagine, this is not a scalar argument (it's a list! – later…) PLC - Perl Scalar Data (v2)
Scalar/String Interpolation • Double quoted string literals are subject to variable interpolation $meal = “brontosaurus steak”; $barney = “fred ate a $meal” $barney = ’fred ate a ’ . $meal; $barney = “fred ate a $meat”; # what happens here? print “$fred”; # unneeded quote marks print $fred; # the preferred style $fred = ’hello’; print “The name is \$fred.\n”; # prints dollar sign print ’The name is $fred’ . “\n”; # single quoted string # works same as previous PLC - Perl Scalar Data (v2)
Variable Name Delimeter • Perl provides a delimiter for the variable name. Enclose the name of the variable in curly braces $what = “brontosaurus steak”; $n = 3; print “fred ate $n $whats.\n”; # problem print “fred ate $n $what” . “s.\n”; # cumbersome print ‘fred ate ‘ . $n . ‘ ‘ . $what . “s,\n”; # ugh! print “fred ate $n ${what}s.\n”; # easy easy PLC - Perl Scalar Data (v2)
Operator Precedence and Associativity AssociativityOperators left parentheses and arguments to list operators left -> ++ -- (autoincrement, autodecrement) right ** right \ ! ~ + - (unary operators) left =~ !~ left * / % x left + - . (binary operators) left << >> named unary operators (-X filetests, rand) < <= > >= lt le gt ge (the “unequal” ones) == != <=> eq ne cmp (the “equal” ones) left & left | ^ left && left || right ?: (ternary) right = += -= .= (and similar assignment operators) left , => list operators (rightward) right not left and left or xor PLC - Perl Scalar Data (v2)
Operator Precedence and Associativity • Associativity resolves the order of operations when two operators of the same precedence compete for three operands. 4 ** 3 ** 2 # 4 ** (3 ** 2) 72 / 12 / 3 # (72 / 12) / 3 36 / 6 * 3 # (36 / 6) * 3 • Use parentheses if you are unsure (or untrusting!) PLC - Perl Scalar Data (v2)
Comparison Operators • The logical comparison operators returns true or false ComparisonNumericString Equal == eq Not equal != ne Less than < lt Greater than > gt Less than or equal <= le Greater than or equal to >= ge 35 != 30 + 5 # false 35 == 35.0 # true ’35’ eq ’35.0’ # false (why?) ’fred’ lt ’barney’ # false ’fred’ lt ’free’ # true ’fred’ eq “fred” # true ’fred’ eq “Fred” # false ‘ ‘ gt ‘‘ # true PLC - Perl Scalar Data (v2)
The if Control Structure if ($name gt ’fred’) { print “’$name’ comes after ’fred’ in sorted order.\n”; } else { print “’$name’ does not come after ’fred’.\n”; } • Curly braces are required around all conditional statements (unlike C) • The conditional can come afterthe statement, and the parentheses can be omitted { print “’$name’ > ’fred’.\n” } if $name gt ’fred’; • You can reverse the test sense by substituting “unless” for “if” unless($name le ‘fred’){print “’$name’ > ‘fred’.\n”;} PLC - Perl Scalar Data (v2)
Boolean Values • Boolean values may be stored in a scalar $is_bigger = $name gt ’fred’; if ($is_bigger) {…} • Perl has no separate boolean type. The rules: • The special variable undef is false • Zero is false, all other numbers are true • The empty string (’’) is false; all other strings are normally true • Since numbers and strings are equivalent, the string form of zero, ’0’, has the same value as its numeric form: false • Everything else is true • Use the "unary not” operator, !, to get the opposite boolean value if (! $is_bigger ) {…} PLC - Perl Scalar Data (v2)
Getting User Input • Use the line operator <STDIN>in place of a scalar variable to read the next complete line from standard input (a blocking call) • The string value will maintain the newline character! $line = <STDIN>; if ($line eq “\n”) { print “That was just a blank line!\n”; } else { print “That line of input was: $line”; } • It’s often useful to be able to discard the newline character PLC - Perl Scalar Data (v2)
chomp • The chomp operator removes the newline character from a line $text = “a line of text\n”; # or from <STDIN> chomp($text); # bye bye newline • “Anytime you need a variable in Perl, you can use assignment instead” # $text stores chomped string # $removed is the number of characters removed $removed = chomp($text = <STDIN>); • chomp only removes one newline. • If there is no newline, it does nothing and returns 0 PLC - Perl Scalar Data (v2)
while Control Structure • The classic looping structure: $count = 0; while ($count < 10) { $count += 1; print “count is now $count\n”; } • Truth value works the same as with if control structure • Curly braces are required • The conditional expression is evaluated before the first iteration PLC - Perl Scalar Data (v2)
undef • Variables have a special undef value before they are given a value • As a numeric, undef is treated as 0, and • as a string it is treated as the empty string • But, undef is neither a number nor a string, it’s an entirely separate scalar value $n = 1; while ($n < 10) { $sum += $n; # using undef initially as 0 $n += 2; } print “The total was $sum.\n”; $string .= “more text\n”; # using undef as empty string PLC - Perl Scalar Data (v2)
defined • To tell whether a value is undef and not the empty string, use the defined function, which • returns false for undef and • true for everything else $madonna = <STDIN>; if ( defined($madonna) ) { print “The input was $madonna\n”; } else { print “No input available!\n”; } • To force a variable to be undefined: $madonna = undef; # as if it had never been touched PLC - Perl Scalar Data (v2)
Revision History • Revision History • v1.00, 10/6/2003 2:48 PM, sps Initial revision. • v1.01, 1/14/2004 10:54 AM, sps 20032 updates. • v1.02, 4/6/2004 2:54 PM, sps 20033 updates. • v1.03, 4/7/2004 10:47 AM, sps Touched up some examples. -- v2.0, 1/9/2005, chr PLC - Perl Scalar Data (v2)