11.1 variable types in perl scalararrayhash $number -3.54 $string "hi\n" @array %hash...

21
11.1 Variable types in PERL Scalar Array Hash $ number -3.54 $ string "hi\n " @ array % hash $ array[0] $ hash{key}

Post on 19-Dec-2015

231 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.1 Variable types in PERL

Scalar Array Hash

$number-3.54

$string"hi\n"

@array %hash

$array[0]

$hash{key}

Page 2: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.2

An associative array (or simply – a hash) is an unordered set of pairs of keys and

values. Each key is associated with a value. A hash variable name starts with a “%”:

my %hash;

Initialization:

%hash = ("a"=>5, "bob"=>"zzz", 50=>"John");

Accessing:

you can access a value by its key:

print $hash{50}; John

modifying:

$hash{bob} = "aaa"; (modifying an existing value)

adding:

$hash{555} = "z"; (adding a new key-value pair)

Hash – an associative array

%hash

5"a"

"zzz""bob"

"John"50

"aaa"

%hash

5"a"

"aaa""bob"

"John"50

"z"555

Page 3: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.3

It is possible to get a list of all the keys in %hash

my @hashKeys = keys(%hash);

Similarly you can get an array of the values in %hash

my @hashVals = values(%hash);

Obtaining a list of the elements in a hash

@hashVals

5 "John" "zzz"

@hashKeys

50 "bob" "a"

%hash

5"a"

"zzz""bob"

"John"50

Page 4: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.4

You can use combinations of hashes (and arrays) together to construct more

complex data structures.

If the information is best represented in two levels it is useful to use a hash within a

hash:

my %hash;

$hash{Key_level_1}{Key_level_2};

Hash within Hash

Page 5: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.5

Example: each name in the phone book, has both phone number and address:my %phoneBook;

$phoneBook{"Eyal"}{"Phone"} = "09-9545995";

$phoneBook{"Eyal"}{"Address"} = "115 Menora St., Hulun";

$phoneBook{"Ofir"}{"Phone"} = "054-4898799";

$phoneBook{"Ofir"}{"Address"} = "31 Horkanus St., Eilat";

Hash within Hash

%phoneBook

"Eyal"

"Ofir"

"Dudu"

"09-9"…"Phone"

"Hulun""Addrs"

"054"…-"Phone"

"Eilat""Addrs"

9245"Phone"

TAU"Addrs"

%phoneBookNAME => {Phone => PHONE Address => ADDRESS}

Key I: name Key II: dataType CorrespondingValue

Page 6: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.6

Assignment:my %phoneBook;

$phoneBook{"Eyal"}{"Phone"} = "09-9545995";

$phoneBook{"Eyal"}{"Address"} = "115 Menora St., Hulun";

Access: print $phoneBook{"Eyal"}{"Phone"}; 09-9545995

Modify:$phoneBook{"Eyal"}{"Phone"} = 03-6407963;

Hash within Hash

%phoneBook

"Eyal"

"Ofir"

"Dudu"

"09-9"…"Phone"

"Hulun""Addrs"

"054"…-"Phone"

"Eilat""Addrs"

9245"Phone"

TAU"Addrs"

%phoneBookNAME => {Phone => PHONE Address => ADDRESS}

Page 7: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.7

More Complex Data Structures

Page 8: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.8

“How to keep the phone number, address and list of grades for each student in a course?”

$phoneBook{"Eyal"}{"Phone"} = 7693;

$phoneBook{"Eyal"}{"Address"} = "34 HaShalom St.";

$phoneBook{"Eyal"}{"Grades"}[0]= 93;

$phoneBook{"Eyal"}{"Grades"}[1]= 72;

$phoneBook{"Eyal"}{"Grades"}[2]= 87;

print $phoneBook{"Eyal"}{"Grades"}[2];

87

Array within hash within hash…

%phoneBookNAME => {"Phone" => PHONE "Address" => ADDRESS "Grades" => [GRADES]}

%phoneBook

"Eyal"

"Ofir"

7693"Phone"

"34"…"Addrs"

"Grades" 72 8793

9245"Phone"

TAU"Addrs"

"Grades" 82 10090

Page 9: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.9

An alternative way to insert the array of grades:

$phoneBook{"Eyal"}{"Phone"} = 7693;

$phoneBook{"Eyal"}{"Address"} = "34 HaShalom St.";

@grades = (93,72,87);

$phoneBook{"Eyal"}{"Grades"} = [@grades];

print $phoneBook{"Eyal"}{"Grades"}[2];

87

Array within hash within hash…

%phoneBookNAME => {"Phone" => PHONE "Address" => ADDRESS "Grades" => [GRADES]}

%phoneBook

"Eyal"

"Ofir"

7693"Phone"

"34"…"Addrs"

"Grades" 72 8793

9245"Phone"

TAU"Addrs"

"Grades" 82 10090

The will create a copy of @grades

Page 10: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.10

How would you make a matrix?

my @matrix;

matrix[0][0] = 23;

matrix[0][1] = 5;

...

How would you make a 3D matrix??

How would you make a array of hashes???

To Infinity and Beyond!!

Page 11: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11ex.11

%genesPRODUCT => {"protein_id" => PROTEIN_ID "strand" => STRAND "CDS" => [START, END]}

%genesPRODUCT => {"protein_id" => PROTEIN_ID "strand" => STRAND}

%genesPRODUCT => {"protein_id" => PROTEIN_ID}

Class exercise 11a1. Read the adenovirus genome file and build a hash of genes, where the key is the "product" name: For each gene store a hash with the protein ID. Print all keys (names) in the hash.

2. Add to the hash the strand of the gene on the genome: “+” for the sense strand and “-” for the antisense strand. Print all antisense genes.

3. Add to the hash an array of two coordinates – the start and end of the CDS. Print genes shorter than 500bp.

4*. Print the product name of all genes on the sense strand whose CDS spans more than 1kbp, and all genes on the antisense strand whose CDS spans less than 500bp.

Page 12: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.12

Subroutines

Page 13: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.13

A subroutine is a user-defined function. Subroutine definition:

sub SUB_NAME {# Do something

...

}

Note:

Subroutine definitions may be placed anywhere in a script, but they are

usually placed together at the beginning or the end.

Subroutines

For example:

sub printHello {

print "Hello world\n";

}

Page 14: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.14

To invoke (execute) a subroutine:

SUB_NAME(PARAMETERS);

Subroutines

For example:

printHello();

Hello world

print reverseComplement("GCAGTG");

CGTCAC

Page 15: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.15

Code in a subroutine is reusable (i.e. it can be invoked from several points

in the script, no code duplication)

e.g. a subroutine that reverse-complement a DNA sequence A subroutine can provide a general solution that may be applied in

different situations.

e.g. read a FASTA file

Why use subroutines?

Page 16: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.16

Encapsulation: A well defined task can be done in a subroutine, making the

main script simpler and easier to read and understand.

For example:

$seq = readFastaFile($fileName); # reads a FASTA sequence

$revSeq = reverseComplement($seq); # reverse complement

the

sequnce

printFasta($revSeq); # prints the sequence in

FASTA format

Why use subroutines? - Example

Page 17: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.17

A subroutine may be given arguments through the special array variable @_:

sub bartFunc {

my ($string, $times) = @_;

print $string x $times;

}

my $bart4today = "I will not eat things for money\n";

bartFunc($bart4today ,100);

I will not eat things for money

I will not eat things for money

I will not eat things for money

I will not eat things for money

I will not eat things for money

I will not eat things for money

I will not eat things for money

Subroutine arguments

Page 18: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.18

Definition:

sub reverseComplement {

my ($seq) = @_;

$seq =~ tr/ACGT/TGCA/;

$seq = reverse $seq;

return $seq;

}

Usage:

my $revSeq = reverseComplement("GCAGTG"); CACTGC

Notes: The return function ends the execution of the subroutine and returns a value. If there is no (explicit) return statement, the value of the last statement in the subroutine is returned.

Return value

Page 19: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.19

A subroutine may also return a list value:

sub integerDivide {

my ($a,$b) = @_;

my $mana = int($a/$b);

my $sheerit = $a % $b;

return ($mana,$sheerit);

}

my ($myMana,$mySheerit) = integerDivide(7,3);

print "mana= $mana, sheerit= $sheerit";

mana= 2, sheerit= 1

Return value a list

Page 20: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11.20

When a variable is defined using my inside a subroutine:

* It does not conflict with a variable by the same name outside the subroutine

* It’s existence is limited to the scope of the subroutine

sub printHello {

my ($name) = @_;

print "Hello $name\n";

}

my $name = "Yossi";

printHello("Moshe");

print "Bye $name\n";

Note:

This effect also holds for my variables in any other “block” of statements in curly brackets – {…}

(such as in if-else controls and in loops)

Variable scope

Hello MosheBye Yossi

Page 21: 11.1 Variable types in PERL ScalarArrayHash $number -3.54 $string "hi\n" @array %hash $array[0] $hash{key}

11ex.21Class exercise 11b

1. Write a subroutine that takes two numbers and prints their sum to thescreen (and test it with an appropriate script!)

2. Write a subroutine that takes two numbers and return a list of their sum, difference, and average.For example:@arr = numbersFunc(5,7);print "@arr"; 12 -2 6

3. a. Write a subroutine that takes a sentence and returns the last word. b.* Return the longest word!