Drop Down MenusCSS Drop Down MenuPure CSS Dropdown Menu

Monday, 29 December 2014

ASSEMBLY LANGUAGE

GO TO LINK & DOWNLOAD:ASSEMBLY_LANGUAGE_EBOOK PDF

GO TO LINK & DOWNLOAD:BASIC_ASSEMBLY_LANGUAGE EBOOK PDF

What is Assembly Language?

Each personal computer has a microprocessor that manages the computer's arithmetical, logical and control activities.
Each family of processors has its own set of instructions for handling various operations like getting input from keyboard, displaying information on screen and performing various other jobs. These set of instructions are called 'machine language instructions'.
Processor understands only machine language instructions which are strings of 1's and 0's. However, machine language is too obscure and complex for using in software development. So, the low-level assembly language is designed for a specific family of processors that represents various instructions in symbolic code and a more understandable form.

Advantages of Assembly Language

An understanding of assembly language provides knowledge of:
  • Interface of programs with OS, processor and BIOS;
  • Representation of data in memory and other external devices;
  • How processor accesses and executes instruction;
  • How instructions access and process data;
  • How a program accesses external devices.
Other advantages of using assembly language are:
  • It requires less memory and execution time;
  • It allows hardware-specific complex jobs in an easier way;
  • It is suitable for time-critical jobs;
  • It is most suitable for writing interrupt service routines and other memory resident programs.

Basic Features of PC Hardware

The main internal hardware of a PC consists of the processor, memory and the registers. The registers are processor components that hold data and address. To execute a program, the system copies it from the external device into the internal memory. The processor executes the program instructions.
The fundamental unit of computer storage is a bit; it could be on (1) or off (0). A group of nine related bits makes a byte. Eight bits are used for data and the last one is used for parity. According to the rule of parity, number of bits that are on (1) in each byte should always be odd.
So, the parity bit is used to make the number of bits in a byte odd. If the parity is even, the system assumes that there had been a parity error (though rare) which might have caused due to hardware fault or electrical disturbance.
The processor supports the following data sizes:
  • Word: a 2-byte data item
  • Doubleword: a 4-byte (32 bit) data item
  • Quadword: an 8-byte (64 bit) data item
  • Paragraph: a 16-byte (128 bit) area
  • Kilobyte: 1024 bytes
  • Megabyte: 1,048,576 bytes

Addressing Data in Memory

The process through which the processor controls the execution of instructions is referred as the fetch-decode-execute cycle or the execution cycle. It consists of three continuous steps:
  • Fetching the instruction from memory
  • Decoding or identifying the instruction
  • Executing the instruction
The processor may access one or more bytes of memory at a time. Let us consider a hexadecimal number 0725H. This number will require two bytes of memory. The high-order byte or most significant byte is 07 and the low-order byte is 25.
The processor stores data in reverse-byte sequence, i.e., the low-order byte is stored in low memory address and high-order byte in high memory address. So if processor brings the value 0725H from register to memory, it will transfer 25 first to the lower memory address and 07 to the next memory address.
Data at memory
x: memory address
When the processor gets the numeric data from memory to register, it again reverses the bytes. There are two kinds of memory addresses:
  • An absolute address - a direct reference of specific location.
  • The segment address (or offset) - starting address of a memory segment with the offset value.

Assembly - Environment Setup

Assembly language is dependent upon the instruction set and the architecture of the processor. In this tutorial, we focus on Intel 32 processors like Pentium. To follow this tutorial, you will need:
  • An IBM PC or any equivalent compatible computer
  • A copy of Linux operating system
  • A copy of NASM assembler program
There are many good assembler programs, like:
  • Microsoft Assembler (MASM)
  • Borland Turbo Assembler (TASM)
  • The GNU assembler (GAS)
We will use the NASM assembler, as it is:
  • Free. You can download it from various web sources.
  • Well documented and you will get lots of information on net.
  • Could be used on both Linux and Windows.

Installing NASM

If you select "Development Tools" while installing Linux, you may get NASM installed along with the Linux operating system and you do not need to download and install it separately. For checking whether you already have NASM installed, take the following steps:
  • Open a Linux terminal.
  • Type whereis nasm and press ENTER.
  • If it is already installed, then a line like, nasm: /usr/bin/nasm appears. Otherwise, you will see just nasm:, then you need to install NASM.
To install NASM take the following steps:
  • Check The netwide assembler (NASM) website for the latest version.
  • Download the Linux source archive nasm-X.XX. ta .gz, where X.XX is the NASM version number in the archive.
  • Unpack the archive into a directory which creates a subdirectory nasm-X. XX.
  • cd to nasm-X. XX and type ./configure . This shell script will find the best C compiler to use and set up Makefiles accordingly.
  • Type make to build the nasm and ndisasm binaries.
  • Type make install to install nasm and ndisasm in /usr/local/bin and to install the man pages.
This should install NASM on your system. Alternatively, you can use an RPM distribution for the Fedora Linux. This version is simpler to install, just double-click the RPM file.

Assembly - Basic Syntax

An assembly program can be divided into three sections:
  • The data section
  • The bss section
  • The text section

The data Section

The data section is used for declaring initialized data or constants. This data does not change at runtime. You can declare various constant values, file names or buffer size, etc., in this section.
The syntax for declaring data section is:
section .data

The bss Section

The bss section is used for declaring variables. The syntax for declaring bss section is:
section .bss

The text section

The text section is used for keeping the actual code. This section must begin with the declarationglobal _start, which tells the kernel where the program execution begins.
The syntax for declaring text section is:
section .text
global _start
_start:

Comments

Assembly language comment begins with a semicolon (;). It may contain any printable character including blank. It can appear on a line by itself, like:
; This program displays a message on screen
or, on the same line along with an instruction, like:
add eax ,ebx    ; adds ebx to eax

Assembly Language Statements

Assembly language programs consist of three types of statements:
  • Executable instructions or instructions
  • Assembler directives or pseudo-ops
  • Macros
The executable instructions or simply instructions tell the processor what to do. Each instruction consists of an operation code (opcode). Each executable instruction generates one machine language instruction.
The assembler directives or pseudo-ops tell the assembler about the various aspects of the assembly process. These are non-executable and do not generate machine language instructions.
Macros are basically a text substitution mechanism.

Syntax of Assembly Language Statements

Assembly language statements are entered one statement per line. Each statement follows the following format:
[label]   mnemonic   [operands]   [;comment]
The fields in the square brackets are optional. A basic instruction has two parts, the first one is the name of the instruction (or the mnemonic), which is to be executed, and the second are the operands or the parameters of the command.
Following are some examples of typical assembly language statements:
INC COUNT ; Increment the memory variable COUNT
MOV TOTAL, 48 ; Transfer the value 48 in the
; memory variable TOTAL
ADD AH, BH ; Add the content of the
; BH register into the AH register
AND MASK1, 128 ; Perform AND operation on the
; variable MASK1 and 128
ADD MARKS, 10 ; Add 10 to the variable MARKS
MOV AL, 10 ; Transfer the value 10 to the AL register

Assembly - Constants

There are several directives provided by NASM that define constants. We have already used the EQU directive in previous chapters. We will particularly discuss three directives:
  • EQU
  • %assign
  • %define

The EQU Directive

The EQU directive is used for defining constants. The syntax of the EQU directive is as follows:
CONSTANT_NAME EQU expression
For example,
TOTAL_STUDENTS equ 50
You can then use this constant value in your code, like:
mov  ecx,  TOTAL_STUDENTS 
cmp  eax,  TOTAL_STUDENTS
The operand of an EQU statement can be an expression:
LENGTH equ 20
WIDTH  equ 10
AREA   equ length * width
Above code segment would define AREA as 200.

Assembly - Arithmetic Instructions

The INC Instruction

The INC instruction is used for incrementing an operand by one. It works on a single operand that can be either in a register or in memory.

SYNTAX:

The INC instruction has the following syntax:
INC destination
The operand destination could be an 8-bit, 16-bit or 32-bit operand.

EXAMPLE:

INC EBX      ; Increments 32-bit register
INC DL       ; Increments 8-bit register
INC [count]  ; Increments the count variable

The DEC Instruction

The DEC instruction is used for decrementing an operand by one. It works on a single operand that can be either in a register or in memory.

SYNTAX:

The DEC instruction has the following syntax:.
DEC destination
The operand destination could be an 8-bit, 16-bit or 32-bit operand.

EXAMPLE:

segment .data
 count dw  0
 value db  15
segment .text
 inc [count]
 dec [value]
 mov ebx, count
 inc word [ebx]
 mov esi, value
 dec byte [esi]

The ADD and SUB Instructions

The ADD and SUB instructions are used for performing simple addition/subtraction of binary data in byte, word and doubleword size, i.e., for adding or subtracting 8-bit, 16-bit or 32-bit operands, respectively.

SYNTAX:

The ADD and SUB instructions have the following syntax:
ADD/SUB destination, source
The ADD/SUB instruction can take place between:
  • Register to register
  • Memory to register
  • Register to memory
  • Register to constant data
  • Memory to constant data
However, like other instructions, memory-to-memory operations are not possible using ADD/SUB instructions. An ADD or SUB operation sets or clears the overflow and carry flags.

EXAMPLE:

The following example asks two digits from the user, stores the digits in the EAX and EBX register, respectively, adds the values, stores the result in a memory location 'res' and finally displays the result.
SYS_EXIT  equ 1
SYS_READ  equ 3
SYS_WRITE equ 4
STDIN     equ 0
STDOUT    equ 1

segment .data 

    msg1 db "Enter a digit ", 0xA,0xD 
    len1 equ $- msg1 

    msg2 db "Please enter a second digit", 0xA,0xD 
    len2 equ $- msg2 

    msg3 db "The sum is: "
    len3 equ $- msg3

segment .bss

    num1 resb 2 
    num2 resb 2 
    res resb 1    

section .text
    global _start    ;must be declared for using gcc
_start:    ;tell linker entry point
    mov eax, SYS_WRITE         
    mov ebx, STDOUT         
    mov ecx, msg1         
    mov edx, len1 
    int 0x80                

    mov eax, SYS_READ 
    mov ebx, STDIN  
    mov ecx, num1 
    mov edx, 2
    int 0x80            

    mov eax, SYS_WRITE        
    mov ebx, STDOUT         
    mov ecx, msg2          
    mov edx, len2         
    int 0x80

    mov eax, SYS_READ  
    mov ebx, STDIN  
    mov ecx, num2 
    mov edx, 2
    int 0x80        

    mov eax, SYS_WRITE         
    mov ebx, STDOUT         
    mov ecx, msg3          
    mov edx, len3         
    int 0x80

    ; moving the first number to eax register and second number to ebx
    ; and subtracting ascii '0' to convert it into a decimal number
    mov eax, [number1]
    sub eax, '0'
    mov ebx, [number2]
    sub ebx, '0'

    ; add eax and ebx
    add eax, ebx
    ; add '0' to to convert the sum from decimal to ASCII
    add eax, '0'

    ; storing the sum in memory location res
    mov [res], eax

    ; print the sum 
    mov eax, SYS_WRITE        
    mov ebx, STDOUT
    mov ecx, res         
    mov edx, 1        
    int 0x80
exit:    
    mov eax, SYS_EXIT   
    xor ebx, ebx 
    int 0x80
When the above code is compiled and executed, it produces the following result:
Enter a digit:
3
Please enter a second digit:
4
The sum is:
7

The MUL/IMUL Instruction

There are two instructions for multiplying binary data. The MUL (Multiply) instruction handles unsigned data and the IMUL (Integer Multiply) handles signed data. Both instructions affect the Carry and Overflow flag.

SYNTAX:

The syntax for the MUL/IMUL instructions is as follows:
MUL/IMUL multiplier
Multiplicand in both cases will be in an accumulator, depending upon the size of the multiplicand and the multiplier and the generated product is also stored in two registers depending upon the size of the operands. Following section explains MUL instructions with three different cases:
SNScenarios
1When two bytes are multiplied
The multiplicand is in the AL register, and the multiplier is a byte in the memory or in another register. The product is in AX. High-order 8 bits of the product is stored in AH and the low-order 8 bits are stored in AL
8 bit Source Registers in MUL instruction
2When two one-word values are multiplied
The multiplicand should be in the AX register, and the multiplier is a word in memory or another register. For example, for an instruction like MUL DX, you must store the multiplier in DX and the multiplicand in AX.
The resultant product is a double word, which will need two registers. The high-order (leftmost) portion gets stored in DX and the lower-order (rightmost) portion gets stored in AX.
16 bit Source Registers in MUL instruction
3When two doubleword values are multiplied
When two doubleword values are multiplied, the multiplicand should be in EAX and the multiplier is a doubleword value stored in memory or in another register. The product generated is stored in the EDX:EAX registers, i.e., the high order 32 bits gets stored in the EDX register and the low order 32-bits are stored in the EAX register.
32 bit Source Registers in MUL instruction

                      FOR MORE  STUDY DOWNLOAD PDF 

PERL PROGRAMMING LANGUAGE

PERL PROGRAMMING LANGUAGE



GO TO LINK & DOWNLOADO'REILLY_LEARNING_PERL_EBOOK PDF

GO TO LINK & DOWNLOAD:PERL_QUICK_LEARNING PDF

GO TO LINK & DOWNLOAD:PERL_EXAMPLES

Perl - Introduction

Perl is a general-purpose programming language originally developed for text manipulation and now used for a wide range of tasks including system administration, web development, network programming, GUI development, and more.

What is Perl?

  • Perl is a stable, cross platform programming language.
  • Though Perl is not officially an acronym but few people used it as Practical Extraction and Report Language.
  • It is used for mission critical projects in the public and private sectors.
  • Perl is an Open Source software, licensed under its Artistic License, or the GNU General Public License (GPL).
  • Perl was created by Larry Wall.
  • Perl 1.0 was released to usenet's alt.comp.sources in 1987
  • At the time of writing thi tutorial, latest version of perl is 5.16.2
  • Perl is listed in the Oxford English Dictionary.
PC Magazine named Perl a finalist for its 1998 Technical Excellence Award in the Development Tool category.

Perl Features

  • Perl takes the best features from other languages, such as C, awk, sed, sh, and BASIC, among others.
  • Perls database integration interface DBI supports third-party databases including Oracle, Sybase, Postgres, MySQL and others.
  • Perl works with HTML, XML, and other mark-up languages.
  • Perl supports Unicode.
  • Perl is Y2K compliant.
  • Perl supports both procedural and object-oriented programming.
  • Perl interfaces with external C/C++ libraries through XS or SWIG.
  • Perl is extensible. There are over 20,000 third party modules available from the Comprehensive Perl Archive Network (CPAN).
  • The Perl interpreter can be embedded into other systems.

Perl and the Web

  • Perl used to be the most popular web programming language due to its text manipulation capabilities and rapid development cycle.
  • Perl is widely known as " the duct-tape of the Internet".
  • Perl can handle encrypted Web data, including e-commerce transactions.
  • Perl can be embedded into web servers to speed up processing by as much as 2000%.
  • Perl's mod_perl allows the Apache web server to embed a Perl interpreter.
  • Perl's DBI package makes web-database integration easy.

Perl is Interpreted

Perl is an interpreted, which means that your code can be run as is, without a compilation stage that creates a non portable executable program.
Traditional compilers convert programs into machine language. When you run a Perl program, it's first compiled into a byte code, which is then converted ( as the program runs) into machine instructions. So it is not quite the same as shells, or Tcl, which are strictly interpreted without an intermediate representation.
Neither it is like most versions of C or C++, which are compiled directly into a machine dependent format. It is somewhere in between, along with Python and awk and Emacs .elc files.

Perl - Environment Setup

Before we start writing our Perl programs, let's understand how to setup our Perl environment. Perl is available on a wide variety of platforms:
  • Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX etc.)
  • Win 9x/NT/2000/
  • WinCE
  • Macintosh (PPC, 68K)
  • Solaris (x86, SPARC)
  • OpenVMS
  • Alpha (7.2 and later)
  • Symbian
  • Debian GNU/kFreeBSD
  • MirOS BSD
  • And many more...

Perl - Syntax Overview

Perl borrows syntax and concepts from many languages: awk, sed, C, Bourne Shell, Smalltalk, Lisp and even English. However, there are some definite differences between the languages. This chapter is designed to quickly get you up to speed on the syntax that is expected in Perl.
A Perl program consists of a sequence of declarations and statements which run from the top to the bottom. Loops, subroutines, and other control structures allow you to jump around within the code. Every simple statement must end with a semicolon (;).
Perl is a free-form language: you can format and indent it however you like. Whitespace serves mostly to separate tokens, unlike languages like Python where it is an important part of the syntax, or Fortran where it is immaterial.

Perl - Data Types

Perl is loosely typed language and there is no need to specify a type for your data while using in your program. The Perl interpreter will choose the type based on the context of the data itself.
Perl has three basic data types: scalars, arrays of scalars, and hashes of scalars, also known as associative arrays. Here is little detail about these data types.
S.N.Types and Description
1Scalar:
Scalars are simple variables. They are preceded by a dollar sign ($). A scalar is either a number, a string, or a reference. A reference is actually an address of a variable which we will see in upcoming chapters.
2Arrays:
Arrays are ordered lists of scalars that you access with a numeric index which starts with 0. They are preceded by an "at" sign (@).
3Hashes:
Hashes are unordered sets of key/value pairs that you access using the keys as subscripts. They are preceded by a percent sign (%).

Numeric Literals

Perl stores all the numbers internally as either signed integers or double-precision floating-point values. Numeric literals are specified in any of the following floating-point or integer formats:
TypeValue
Integer1234
Negative integer-100
Floating point2000
Scientific notation16.12E14
Hexadecimal0xffff
Octal0577

String Literals

Strings are sequences of characters. They are usually alphanumeric values delimited by either single (') or double (") quotes. They work much like UNIX shell quotes where you can use single quoted strings and double quoted strings.
Double-quoted string literals allows variable interpolation, and single-quoted strings are not. There are certain characters when they are proceeded by a back slash they will have special meaning and they are used to represent like newline (\n) or tab (\t).
You can embed newlines or any of the following Escape sequences directly in your double quoted strings:
Escape sequenceMeaning
\\Backslash
\'Single quote
\"Double quote
\aAlert or bell
\bBackspace
\fForm feed
\nNewline
\rCarriage return
\tHorizontal tab
\vVertical tab
\0nnCreates Octal formatted numbers
\xnnCreates Hexideciamal formatted numbers
\cXControl characters, x may be any character
\uForce next character to uppercase
\lForce next character to lowercase
\UForce all following characters to uppercase
\LForce all following characters to lowercase
\QBackslash all following non-alphanumeric characters
\EEnd \U, \L, or \Q

Perl - Variables

Variables are nothing but reserved memory locations to store values. This means that when you create a variable you reserve some space in memory.
Based on the data type of a variable, the interpreter allocates memory and decides what can be stored in the reserved memory. Therefore, by assigning different data types to variables, you can store integers, decimals, or strings in these variables.
We have learnt that Perl has following three basic data types:
  • Scalars
  • Arrays
  • Hashes
Accordingly we are going to use three types of variables in Perl. A scalar variable will precede by a dollar sign ($) and it can store either a number, a string, or a reference. A array variable will precede by sign @ and it will store ordered lists of scalars. Finaly Hash variable will precede by sign % and will be used to store sets of key/value pairs.
Perl maintains every variable type in a separate namespace. So you can, without fear of conflict, use the same name for a scalar variable, an array, or a hash. This means that $foo and @foo are two different variables.

Creating Variables

Perl variables do not have to be explicitly declared to reserve memory space. The declaration happens automatically when you assign a value to a variable. The equal sign (=) is used to assign values to variables.
Keep a note that this is mandatory to declare a varibale before we use it if we use use strictstatement in our program.
The operand to the left of the = operator is the name of the variable, and the operand to the right of the = operator is the value stored in the variable. For example:
$age = 25;             # An integer assignment
$name = "John Paul";   # A string 
$salary = 1445.50;     # A floating point
Here 25, "John Paul" and 1445.50 are the values assigned to $age$name and $salary variables, respectively. Shortly we will see how we can assign values to arrays and hashes.

Scalar Variables

A scalar is a single unit of data. That data might be a integer number, floating point, a character, a string, a paragraph, or an entire web page. Simply saying it could be anything, but only a single thing.
Here is a simple example of using scalar variables:
#!/usr/bin/perl

$age = 25;             # An integer assignment
$name = "John Paul";   # A string 
$salary = 1445.50;     # A floating point

print "Age = $age\n";
print "Name = $name\n";
print "Salary = $salary\n";
This will produce following result:
Age = 25
Name = John Paul
Salary = 1445.5

Array Variables

An array is a variable that stores an ordered list of scalar values. Array variables are preceded by an "at" (@) sign. To refer to a single element of an array, you will use the dollar sign ($) with the variable name followed by the index of the element in square brackets.
Here is a simple example of using array variables:
#!/usr/bin/perl

@ages = (25, 30, 40);             
@names = ("John Paul", "Lisa", "Kumar");

print "\$ages[0] = $ages[0]\n";
print "\$ages[1] = $ages[1]\n";
print "\$ages[2] = $ages[2]\n";
print "\$names[0] = $names[0]\n";
print "\$names[1] = $names[1]\n";
print "\$names[2] = $names[2]\n";
Here we used escape sign (\) before $ sign just to print it other Perl will understand it as a variable and will print its value. When exected, this will produce following result:
$ages[0] = 25
$ages[1] = 30
$ages[2] = 40
$names[0] = John Paul
$names[1] = Lisa
$names[2] = Kumar

Hash Variables

A hash is a set of key/value pairs. Hash variables are preceded by a percent (%) sign. To refer to a single element of a hash, you will use the hash variable name followed by the "key" associated with the value in curly brackets.
Here is a simple example of using hash variables:
#!/usr/bin/perl

%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);

print "\$data{'John Paul'} = $data{'John Paul'}\n";
print "\$data{'Lisa'} = $data{'Lisa'}\n";
print "\$data{'Kumar'} = $data{'Kumar'}\n";
This will produce following result:
$data{'John Paul'} = 45
$data{'Lisa'} = 30
$data{'Kumar'} = 40

Variable Context

Perl treats same variable differently based on Context ie. situation where a variable is being used. Let's check following example:
#!/usr/bin/perl

@names = ('John Paul', 'Lisa', 'Kumar');

@copy = @names;
$size = @names;

print "Given names are : @copy\n";
print "Number of names are : $size\n";
This will produce following result:
Given names are : John Paul Lisa Kumar
Number of names are : 3
Here @names is an array, which has been used in two different contexts. First we copied it into anyother array ie. list so it returned all the elements assuming that context is list context. Next we used same array and tried to store this array in a scalar, so in this case it returned just number of elements in this array assuming that context is scalar context. Following table lists down various contexts:
S.N.Context and Description
1Scalar:
Assignment to a scalar variable evaluates the right-hand side in a scalar context.
2List:
Assignment to an array or a hash evaluates the right-hand side in a list context.
3Boolean:
Boolean context is simply any place where an expression is being evaluated to see whether it's true or false
4Void:
This context not only doesn't care what the return value is, it doesn't even want a return value.
5Interpolative:
This context only happens inside quotes, or things that work like quotes.

Perl - Arrays

An array is a variable that stores an ordered list of scalar values. Array variables are preceded by an "at" (@) sign. To refer to a single element of an array, you will use the dollar sign ($) with the variable name followed by the index of the element in square brackets.
Here is a simple example of using array variables:
#!/usr/bin/perl

@ages = (25, 30, 40);             
@names = ("John Paul", "Lisa", "Kumar");

print "\$ages[0] = $ages[0]\n";
print "\$ages[1] = $ages[1]\n";
print "\$ages[2] = $ages[2]\n";
print "\$names[0] = $names[0]\n";
print "\$names[1] = $names[1]\n";
print "\$names[2] = $names[2]\n";
Here we used escape sign (\) before $ sign just to print it other Perl will understand it as a variable and will print its value. When exected, this will produce following result:
$ages[0] = 25
$ages[1] = 30
$ages[2] = 40
$names[0] = John Paul
$names[1] = Lisa
$names[2] = Kumar
In Perl, List and Array terms are often used as if they're interchangeable. But the list is the data, and the array is the variable.

Array Creation

Array variables are prefixed with the @ sign and are populated using either parentheses or the qw operator. For example:
@array = (1, 2, 'Hello');
@array = qw/This is an array/;
The second line uses the qw// operator, which returns a list of strings, separating the delimited string by white space. In this example, this leads to a four-element array; the first element is 'this' and last (fourth) is 'array'. This means that you can use different lines as follows:
@days = qw/Monday
Tuesday
...
Sunday/;
You can also populate an array by assigning each value individually as follows:
$array[0] = 'Monday';
...
$array[6] = 'Sunday';

Accessing Array Elements

When accessing individual elements from an array, you must prefix the variable with a dollar sign ($) and then append the element index within square brackets after the name of the variable. For example:
#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

print "$days[0]\n";
print "$days[1]\n";
print "$days[2]\n";
print "$days[6]\n";
print "$days[-1]\n";
print "$days[-7]\n";
This will produce following result:
Mon
Tue
Wed
Sun
Sun
Mon
Array indices start from zero, so to access first element you need to give 0 as indices. You can also give a negative index, in which case you select the element from the end, rather than the beginning, of the array. This means that
print $days[-1]; # outputs Sun
print $days[-7]; # outputs Mon

Sequential Number Arrays

Perl offers a shortcut for sequential numbers and letters. Rather than typing out each element when counting to 100 for example, we can do something like as follows:
#!/usr/bin/perl

@var_10 = (1..10);
@var_20 = (10..20);
@var_abc = (a..z);

print "@var_10\n";   # Prints number from 1 to 10
print "@var_20\n";   # Prints number from 10 to 20
print "@var_abc\n";  # Prints number from a to z
Here double dot (..) is called range operator. This will produce following result:
1 2 3 4 5 6 7 8 9 10
10 11 12 13 14 15 16 17 18 19 20
a b c d e f g h i j k l m n o p q r s t u v w x y z

Array Size

The size of an array can be determined using scalar context on the array - the returned value will be the number of elements in the array:
@array = (1,2,3);
print "Size: ",scalar @array,"\n";
The value returned will always be the physical size of the array, not the number of valid elements. You can demonstrate this, and the difference between scalar @array and $#array, using this fragment as follows:
#!/uer/bin/perl

@array = (1,2,3);
$array[50] = 4;

$size = @array;
$max_index = $#array;

print "Size:  $size\n";
print "Max Index: $max_index\n";
This will produce following result:
Size: 51
Max Index: 50
There are only four elements in the array that contain information, but the array is 51 elements long, with a highest index of 50.

Adding and Removing Elements in Array

Perl provides a number of useful functions to add and remove elements in an array. You may have a question what is a function? So far you have used print function to print various values. Similarly there are various other functions or sometime called sub-routines which can be used for various other functionalities.
S.N.Types and Description
1push @ARRAY, LIST
Pushes the values of the list onto the end of the array.
2pop @ARRAY
Pops off and returns the last value of the array.
3shift @ARRAY
Shifts the first value of the array off and returns it, shortening the array by 1 and moving everything down
4unshift @ARRAY, LIST
Prepends list to the front of the array, and returns the number of elements in the new array.
#!/usr/bin/perl

# create a simple array
@coins = ("Quarter","Dime","Nickel");
print "1. \@coins  = @coins\n";

# add one element at the end of the array
push(@coins, "Penny");
print "2. \@coins  = @coins\n";

# add one element at the beginning of the array
unshift(@coins, "Dollar");
print "3. \@coins  = @coins\n";

# remove one element from the last of the array.
pop(@coins);
print "4. \@coins  = @coins\n";

# remove one element from the beginning of the array.
shift(@coins);
print "5. \@coins  = @coins\n";
This will produce following result:
1. @coins = Quarter Dime Nickel
2. @coins = Quarter Dime Nickel Penny
3. @coins = Dollar Quarter Dime Nickel Penny
4. @coins = Dollar Quarter Dime Nickel
5. @coins = Quarter Dime Nickel

Slicing Array Elements

You can also extract a "slice" from an array - that is, you can select more than one item from an array in order to produce another array.
#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays = @days[3,4,5];

print "@weekdays\n";
This will produce following result:
Thu Fri Sat
The specification for a slice must a list of valid indices, either positive or negative, each separated by a comma. For speed, you can also use the .. range operator:
#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays = @days[3..5];

print "@weekdays\n";
This will produce following result:
Thu Fri Sat

Replacing Array Elements

Now we are going to introduce one more function called splice(), which has following syntax:
splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]
This function will remove the elements of @ARRAY designated by OFFSET and LENGTH, and replaces them with LIST, if specified. Finally it returns the elements removed from the array. Following is the example:
#!/usr/bin/perl

@nums = (1..20);
print "Before - @nums\n";

splice(@nums, 5, 5, 21..25); 
print "After - @nums\n";
This will produce following result:
Before - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
After - 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20
Here actual replacement begins with the 6th number after that five elements are then replaced from 6 to 10 with the numbers 21, 22, 23, 24 and 25.

Transform Strings to Arrays

Let's look into one more function called split(), which has the following syntax:
split [ PATTERN [ , EXPR [ , LIMIT ] ] ]
This function splits a string into an array of strings, and returns it. If LIMIT is specified, splits into at most that number of fields. If PATTERN is omitted, splits on whitespace. Following is the example:
#!/usr/bin/perl

# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@string = split('-', $var_string);
@names  = split(',', $var_names);

print "$string[3]\n";  # This will print Roses
print "$names[4]\n";   # This will print Michael
This will produce following result:
Roses
Michael

Transform Arrays to Strings

We can use the join() function to rejoin the array elements and form one long scalar string. This function has following syntax:
join EXPR, LIST
This function joins the separate strings of LIST into a single string with fields separated by the value of EXPR, and returns the string. Following is the example:
#!/usr/bin/perl

# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@string = split('-', $var_string);
@names  = split(',', $var_names);

$string1 = join( '-', @string );
$string2 = join( ',', @names );

print "$string1\n";
print "$string2\n";
This will produce following result:
Rain-Drops-On-Roses-And-Whiskers-On-Kittens
Larry,David,Roger,Ken,Michael,Tom

Sorting Arrays

The sort() function sorts each element of an array according to ASCII Numeric standards. This function has following syntax:
sort [ SUBROUTINE ] LIST
This function sorts the LIST and returns the sorted array value. If SUBROUTINE is specified then specified logic inside the SUBTROUTINE is applied while sorting the elements.
#!/usr/bin/perl

# define an array
@foods = qw(pizza steak chicken burgers);
print "Before: @foods\n";

# sort this array
@foods = sort(@foods);
print "After: @foods\n";
This will produce following result:
Before: pizza steak chicken burgers
After: burgers chicken pizza steak
Please note that sorting is performed based on ASCII Numeric value of the words. So the best option is to first transform every element of the array into lowercase letters and then perform the sort function.

The $[ Special Variable

So far you have seen simple variable we defined in our programs and used them to store and print scalar and array values. Perl provides numerous special variables which have their predefined meaning.
We have a speciall variable which is written as $[. This special variable is a scalar containing the first index of all arrays. Because Perl arrays have zero-based indexing, $[ will almost always be 0. But if you set $[ to 1 then all your arrays will use on-based indexing. It is recommended not to use any other indexing other than zero. However, let's take one example to show the usage of $[ variable:
#!/usr/bin/perl

# define an array
@foods = qw(pizza steak chicken burgers);
print "Foods: @foods\n";

# Let's reset first index of all the arrays.
$[ = 1;

print "Food at \@foods[1]: $foods[1]\n";
print "Food at \@foods[2]: $foods[2]\n";
This will produce following result:
Foods: pizza steak chicken burgers
Food at @foods[1]: pizza
Food at @foods[2]: steak

Merging Arrays

Because an array is just a comma-separated sequence of values, you can combine them together as shown below:
#!/usr/bin/perl

@numbers = (1,3,(4,5,6));

print "numbers = @numbers\n";
This will produce following result:
numbers = 1 3 4 5 6
The embedded arrays just become part of the main array as shown below:
#!/usr/bin/perl

@odd = (1,3,5);
@even = (2, 4, 6);

@numbers = (@odd, @even);

print "numbers = @numbers\n";
This will produce following result:
numbers = 1 3 5 2 4 6

Selecting Elements from Lists

The list notation is identical to that for arrays - you can extract an element from an array by appending square brackets to the list and giving one or more indices:
#!/usr/bin/perl

$var = (5,4,3,2,1)[4];

print "value of var = $var\n"
This will produce following result:
value of var = 1
Similarly, we can extract slices, although without the requirement for a leading @ character:
#!/usr/bin/perl

@list = (5,4,3,2,1)[1..3];

print "Value of list = @list\n";
This will produce following result:
Value of list = 4 3 2

FOR MORE DOWNLOAD EBOOK,EXAMPLES 
AND QUICK LERNING PDF