天天看點

Learning Perl 筆記

All numbers have the same format internally in Prel. in fact the Perl  use double-precision floating-point value to store numbers.

Creating charaters by code point: chr(), and ord() metheds.

e.g.

$alef = chr(0x05df) ;
$code_point = ord('d') ;
 
           

In Perl you may write func() wit or without the parentheses. This is a general rule in Perl: except in cases whtere is changes the meaning to remove them, parentheses are always optional.

Undef is a good thing. 

Array & List:

  • A list or array may hold numbers , string, undef value, or any mixture of different scalar values. in other words, can hold different type scalar value in list or array.
  • If the subscript indicates an element that would be beyond the ene of the array, the corresponding value will be undef.
  • How to get the last element index in an array? $#array_name is the last element index.  OR -1 beause, negative array indices conut from the end of the array.
  • push,pop and shift,unshift. end & begin.
  • splice @array_name, start, length, replacement ; the third and fourth arguments is not essential. and length allow is zero.
  • foreach: foreach $var (list) {...}. It not same as Java the $var is not a copy of the list element-it  actually is the list element. That is, if you modify the control variable($var) inside the loop, you modify the element itself.
  • Deault:$_
  • revers,sort

Scalar and List Context:

  • Expressing in Perl always return the appopriate value for their context. In other words, a same thing in defferent context that it's meaning is defferent.
  • Using List-Producing expressions in Scalar Context[email protected] in a list context, it gives the list of elemetns. But in a scalar context, it returns the nunber of elements in the array.sortalways returns undef.reverse returns a reversed string.
  • Using Scalar-producing expresions in List Context.always get a list. e.g. @william = undef; # Gets the one-element list (undef) @betty = ();  #A correct way to emtyp an array.
  • Forcing Scalar Context in List Context. use scalar function.
  • <STDIN> in List Context: returns all of the remaining lines up to the end-of-file. each line as a separate element of the list. use EOF finishing the input. in linux is Ctrl+D, in wiondws is Ctrl+Z.

Subroutines

  • Definition. use the keyword sub define your own subroutine. e.g. sub fuckk {...}
  • Invoking. using the subroutine name that you want invoked with the ampersand&. e.g.&fuckk ;
  • Return Values. all Perl subroutines have a return value--Whatever calcuation is last performed in a subroutine is automatically also the return value.
  • Arguments. Perl has subroutine arguments, to pass an argument list to  the subroutne,after the subroutine invocation. e.g.$n = &fuckk(arg1, arg2...).  Perl automatically stores the paramenter list in the special array variable named @_. The @_ is private to the subroutine.
  • Overwrite. if you define two same-name subroutines, the last will overwrite the first.
  • Private Variable in Subrouines. Private variables called lexical variables at any time with the my operator. e.g. my($n1 $n2) ; by the way, By default,in Perl all variables are global variable. attenionmy has lexical scope. like in C local variable.
  • The use strict pragma. impose a little discipline.
  • The return operator. returns a value from a subroutine immediately.
  • state variales. Persistent Private Variables pretty like static in C, but state  is a priavet variable. you can make any varibale(scalar and list) type a state variable; but you can't initalize a state variable in list contexts. e.g. state @array = qw(a b c); # error

Input and Output

  • Input to Standard Input. STDIN this is standard input filehandle. the <filehandle> of <STDIN> is line_input operator and gives you the next line with \n.
  • -  the hyphen. If you use a hyphen as one of the argumets pass in perl, that the hyphen means standard input as well. If you just only a hyphen argument you can omiss it. because if no invocation arguments, the program should process the standard input stream.
  • The @ARGV array. This is a special array that is preset by Perl interpreter as the list of the invocation arguments. In other words, It store command arguments. but is can bu changed.
  • <> the Diamond Operator. read line data from the @ARGV array.  It also is line_input operator.
    while (<>) { chomp ;...}
               
  • Formatted Output with printf. e.g.printf "Hello,%s your age is %d.\n", "Tom", 18 ; the % sign is called conversions. print a number in what's generally a good way, use %g.decimal use %d, foalt use %f, strng use %s. 
  • Arrays and print. It is defferent print @arry and print "@arry". the print "@array" has a whilespace speasue two elements but print @array is not.
  • Filehandles. a filehandle is the name in Perl program for an I/O connection between your Perl process and the outside world. In fact,It's just the name of connection, not necessarily the name of files. 
  • The six special built-in  filehandlle name. Its is STDIN, STDOUT, STDERR, ARGV, DATA, ARGVOUT. Perl already uses for its own purposes.
  • Filehandles name. Before Perl 5.6, all filehandle names were barewords, and Perl 5.6 added the ability to store a filehandle reference in a normal scalar variable.
  • Opening a filehandle. If you use bareword as a filehandle name, the open styanx is open LOG, '[< | > | >>] file' ; or open LOG, ' < | > | >>', 'fle' ; in 5.6 add "three-argument" open. the file can be a scalar. if the file is a scalar you must use "..." around arugments. In default open a file is only read, if you like this invocate open LGO, 'file' ; If filehandles in a Scalar. e.g. open my $log_fh, '<', 'file' ;
  • Specify an file encoding. If you use  the three-arugments open you can specify an encoding. e.g. open LOG, '<:encoding(UTF-8)', 'file' ; you can get a list of all of the encodings that perl understands with a Perl command: # perl -MEncode -le "print for Encode->encodings(':all')"
  • use binmode func tell output Unicode to STDOUT. e.g. binmode STDOUT, ':encoding(UTF-8)' ; if you don't do this, you might get a warning "Wide charater in print at test line .."
  • Use :crlf Specify file line endings. in DOS the file each line ends with CR-LF pair.(also as "\r\n"). Unix line endings only use the LF. The :crlf encoding can translate a newline to \r\n. e.g. open LOG, '<:crlf', 'file' ; this is open a only read DOS file Prel can translate crfl to newline.  e.g. open LOG, '>:crlf', 'file'; this is open a write file, write this file each lien endings with crlf. (from newlne to crlf).
  • Closeing a Filehandle. close operator close it. e.g. close LOG ;
  • Use die Show Fatal Errors. e.g. die "Has a error: $!\n" ;  the $! stroe a  human-readable complaint error mssage form system. and it well exit the program immidealy.
  • Use warn show a Warning message. the warn show a message to STDERR, but don't exit the program.
  • Automaticlly die-ing. Starting with Perl 5.10, the autodie pragma is part of the Standard Libaray. So you can use autodie ; with open LOG, '>>' , 'file' ; don't write die message.
  • Changing the Default STD flehandle. There are some ways to change the Default STD filehandle. one is you cat  useingselect operator chanages default output filehandle. e.g select LOG ; select return currently output filehanlds. the two way is reopen a Standard filehandle e.g. open STDERR, ">>", "error.log" ;