From 764c7423b65d37d1a8cd913cbe715fc346ac2248 Mon Sep 17 00:00:00 2001 From: Adrian <59370927+adrianfusco@users.noreply.github.com> Date: Sat, 20 Nov 2021 01:12:20 +0100 Subject: [PATCH] Update/move perl section (#187) * New questions and spell check (#181) Added new questions related with KVM, Libvirt and DNF * Create a new perl folder and move the content of the actual section --- README.md | 514 +-------------------------------------- exercises/perl/README.md | 511 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 512 insertions(+), 513 deletions(-) create mode 100644 exercises/perl/README.md diff --git a/README.md b/README.md index aa8b8d5..6d33889 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ puppet
Puppet
Distributed
Distributed
you
Questions you can ask
- perl
Perl
+ perl
Perl
@@ -5034,518 +5034,6 @@ Output: 3 [Golang container/heap package](https://golang.org/pkg/container/heap/) -## Perl - -### Perl Self Assessment - -
-What is Perl?
- -From the official [docs](https://perldoc.perl.org/): - -"Perl officially stands for Practical Extraction and Report Language, except when it doesn't." - -It's a general purpose programming language developed for manipulating texts mainly. It has been used to perform system administration tasks, networking, building websites and more. -
- -
-What data types Perl has? And how can we define it?
- -- Scalar: This is a simple variable that stores single data items. It can be a string, number or reference. - -``` -my $number = 5; -``` - -- Arrays: This is a list of scalars. - -``` -my @numbers = (1, 2, 3, 4, 5); -# or using the `qw` keyword (quote word): -my @numbers = qw/1 2 3 4 5/; -# '/' can be another symbol, e.g qw@1 2 3 4 5@ -``` - -- Hashes (or associative arrays): This is an unordered collection of key-value pairs. We can access to a hash using the keys. - -``` -my %numbers = ( - First => '1', - Second => '2', - Third => '3' -); -``` - -
- -
-How can you access to a hash value, add and delete a key/value pair and modify a hash?
- -``` -my %numbers = ( - 'First' => '1', - 'Second' => '2', - 'Third' => '3' -); -``` - -- Access: - -``` -print($numbers{'First'}); -``` - -- Add: - -``` -$numbers{'Fourth'} = 4; -``` - -- Delete: - -``` -delete $numbers{'Third'}; -``` - -- Modify: - -``` -$numbers{'Fifth'} = 6; -$numbers{'Fifth'} = 5; -``` - -
- -
-How can you iterate an array? And a hash?
- -- Array: - -``` -my @numbers = qw/1 2 3 4 5/; - -# Using `$_` that represents the current iteration in a loop. It starts from index array 0 until the last index. -foreach (@numbers) { - print($_); -} -# Output: 12345 - - -# "$#" returns the max index of an array. That's the reason because we can iterate accesing to the array from the index 0 to the max index. -for my $i (0..$#numbers) { - print($numbers[$i]); -} -# Output: 12345 - - -# Using the `map` keyword: -print map {$_} @numbers; -# Output: 12345 - -# Using `while`. We should take care with this option. When we use `shift` we're deleting the first element of the array and assigning it to the `element` variable. -# After this `loop` the `numbers` array will not have elements. -while (my $element = shift(@numbers)) { - print($element); -} -# Output: 12345 -``` - -- Hashes: - - ``` - my %capital_cities = ( - 'Madrid' => 'Spain', - 'Rome' => 'Italy', - 'Berlin' => 'Germany' -); - -# Iterate and get the `keys`: -foreach my $city (keys %capital_cities) { - print($city . "\n"); -} -# Iterate and get the `values`: -foreach my $country (values %capital_cities) { - print($country . "\n"); -} - -# Iterate and get the values and keys (first option): -foreach my $city (keys %capital_cities) { - print("City: $city - Country: $capital_cities{$city}" . "\n"); -} - -# Iterate and get the values and keys (first option): -while(my ($city, $country) = each %capital_cities) { - print("City: $city - Country: $capital_cities{$city}" . "\n"); -} -``` - -
- -
-What is a Perl subroutine? How to define it?
- -It's the perl model for user defined functions (this is also called function like other programming languages). We can define a subroute with the keyword `sub`. - -``` -sub hello { - print "hello"; -} -``` - -
- -
-Describe the different ways to receive parameters in a subroutine
- -- List assignment: Using the `@_` array. It's a list with the elements that are being passed as parameters. - -``` -sub power { - my ($b, $e) = @_; - return $b ** $e; -} - -&power(2, 3); -``` - -- Individual assigment: We should access to every element of the `@_` array. It starts from zero. - -``` -sub power { - my $b = $_[0]; - my $e = $_[1]; - return $b ** $e; -} - -&power(2, 3); -``` - -- Using `shift` keyword: It's used to remove the first value of an array and it's returned. - -``` -sub power { - my $b = shift; - my $3 = shift; - return $b ** $e; -} - -&power(2, 3); -``` - - -[Source](https://stackoverflow.com/a/21465275/12771230) - -We can also read the best way in the same S.O answer. - -
- -
-What is lexical and dynamic scoping?
-
- -
-How to apply referencing and dereferencing?
-
- -
-Does Perl have conventions?
- -You can check [perlstyle](https://perldoc.perl.org/perlstyle) - -
- -
-What is Perl POD? Can you code an example?
- -From the official [docs](https://perldoc.perl.org/perlpod): - -"Pod is a simple-to-use markup language used for writing documentation for Perl, Perl programs, and Perl modules." - -``` -=item - This function returns the factorial of a number. - Input: $n (number you wanna calculate). - Output: number factorial. -=cut -sub factorial { - my ($i, $result, $n) = (1, 1, shift); - $result = $result *= $i && $i++ while $i <= $n; - return $result; -} -``` - -
- -### Perl Regex - -
-Check if the word `electroencefalografista` exists in a string
- -``` -my $string = "The longest accepted word by RAE is: electroencefalografista"; -if ($string =~ /electroencefalografista/) { - print "Match!"; -} -``` -
- -
-Check if the word `electroencefalografista` does not exists in a string
- -``` -my $string = "The longest not accepted word by RAE is: Ciclopentanoperhidrofenantreno"; -if ($string !~ /electroencefalografista/) { - print "Does not match!"; -} -``` -
- - -
-Replace the word `amazing`
- -``` -my $string = "Perl is amazing!"; -$string =~ s/amazing/incredible/; -print $string; -# Perl is incredible! -``` -
- -
-Extract `hh:mm:ss` with capturing group `()` in the following datetime
- -``` -my $date = "Fri Nov 19 20:09:37 CET 2021"; -my @matches = $date =~ /(.*)(\d{2}:\d{2}:\d{2})(.*)/; -print $matches[1]; -# Output: 20:09:37 -``` -
- -
-Extract all the elements that are numbers in an array
- -``` -my @array = ('a', 1, 'b', 2, 'c', 3); -my @numbers = grep (/\d/, @array); # Note: \d involves more digits than 0-9 -map {print $_ . "\n" } @numbers; -``` - -
- -
-Print all the linux system users that starts with d or D
- -- With a Perl one liner :D -``` -open(my $fh, '<', '/etc/passwd'); -my @user_info = <$fh>; -map { print $& . "\n" if $_ =~ /^d([^:]*)/ } @user_info; -close $fh; -``` - -- Avoiding one-liners - -``` -foreach my $user_line (@user_info) { - if ($user_line =~ /^d([^:]*)/) { - print $& . "\n"; - } -} -``` - -
- -### Perl Files Handle - -
-Mention the different modes in File Handling
- -- Read only: `<` -- Write mode. It creates the file if doesn't exist: `>` -- Append mode. It creates the file if doesn't exist: `>>` -- Read and write mode: `+<` -- Read, clear and write mode. It creates the file if doesn't exist: `+>` -- Read and append. It creates the file if doesn't exist: `+>>` - -
- -
-How to write into a file?
- -``` -# We can use: -# '>' Write (it clears a previous content if exists). -# '>>' Append. -open(my $fh, '>>', 'file_name.ext') or die "Error: file can't be opened"; -print $fh "writing text...\n"; -close($fh); -``` -
- -
-How can you read a file and print every line?
- -``` -open(my $fh, '<', 'file_to_read.ext') or die "Error: file can't be opened"; -my @file = <$fh>; -foreach my $line (@file) { - print $line; -} -``` - -We can use the file handle without assigning it to an array: - -``` -open(my $fh, '<', 'file_to_read.ext') or die "Error: file can't be opened"; - -foreach my $line (<$fh>) { - print $line; -} -``` - -
- -### Perl OOP - -
-Does Perl have support for OOP?
- -From the official [docs](https://perldoc.perl.org/perlootut): - -"By default, Perl's built-in OO system is very minimal, leaving you to do most of the work." - -
- -
-What is the purpose of the bless function?
- -The function os the `bless` function is used to turning a plain data structure into an object. - -
- -
-How to create a Perl class? How can you call a method?
- -- Let's create the package: `Example.pm` - -``` -package Example; - -sub new { - my $class = shift; - my $self = {}; - bless $self, $class; - return $self; -} - -sub is_working { - print "Working!"; -} - -1; -``` - -- Now we can instance the `Example` class and call `is_working` method: - -``` -my $e = new Example(); -$e->is_working(); -# Output: Working! -``` - -
- -
-Does Perl have inheritance? What is the `SUPER` keyword?
- -Yes, Perl supports inheritance. We can read about it in the official [docs](https://perldoc.perl.org/perlobj#Inheritance). -We also can read about `SUPER` keyword that is used to call a method from the parent class. It gives an example about how we can apply inheritance. -
- -
-Does Perl have polymorphism? What is method overriding?
- -Yes, it has polymorphism. In fact method overriding is a way to apply it in Perl. - -Method overriding in simple words appears when we have a class with a method that already exist in a parent class. - -Example: - -``` -package A; - -sub new { return bless {}, shift; }; -sub printMethod { print "A\n"; }; - -package B; - -use parent -norequire, 'A'; - -sub new { return bless {}, shift; }; -sub printMethod { print "B\n"; }; - -my $a = A->new(); -my $b = B->new(); - -A->new()->printMethod(); -B->new()->printMethod(); - -# Output: -# A -# B -``` - -
- -
-How can you call a method of an inherited class?
- -``` -# Class `A` with `printA` method. -package A; - -sub new { return bless {}, shift; }; -sub printA { print "A"; }; - -# Class `B` that extends or use the parent class `A`. -package B; - -use parent -norequire, 'A'; - -sub new { return bless {}, shift; }; - -# Instance class `B` allows call the inherated method -my $b = B->new(); -$b->printA(); -``` -
- -### Perl OS - -
-What is Perl Open3?
-
- -### Perl Packages & Modules - -
-What is a Perl package? And a module?
-
- -
-What is the difference between .pl and .pm extensions?
-
- -
-What is cpan? And cpanm?
-
- -
-How can you install a Perl module?
-
- ## Mongo
diff --git a/exercises/perl/README.md b/exercises/perl/README.md new file mode 100644 index 0000000..546e435 --- /dev/null +++ b/exercises/perl/README.md @@ -0,0 +1,511 @@ +## Perl + +### Perl Self Assessment + +
+What is Perl?
+ +From the official [docs](https://perldoc.perl.org/): + +"Perl officially stands for Practical Extraction and Report Language, except when it doesn't." + +It's a general purpose programming language developed for manipulating texts mainly. It has been used to perform system administration tasks, networking, building websites and more. +
+ +
+What data types Perl has? And how can we define it?
+ +- Scalar: This is a simple variable that stores single data items. It can be a string, number or reference. + +``` +my $number = 5; +``` + +- Arrays: This is a list of scalars. + +``` +my @numbers = (1, 2, 3, 4, 5); +# or using the `qw` keyword (quote word): +my @numbers = qw/1 2 3 4 5/; +# '/' can be another symbol, e.g qw@1 2 3 4 5@ +``` + +- Hashes (or associative arrays): This is an unordered collection of key-value pairs. We can access to a hash using the keys. + +``` +my %numbers = ( + First => '1', + Second => '2', + Third => '3' +); +``` + +
+ +
+How can you access to a hash value, add and delete a key/value pair and modify a hash?
+ +``` +my %numbers = ( + 'First' => '1', + 'Second' => '2', + 'Third' => '3' +); +``` + +- Access: + +``` +print($numbers{'First'}); +``` + +- Add: + +``` +$numbers{'Fourth'} = 4; +``` + +- Delete: + +``` +delete $numbers{'Third'}; +``` + +- Modify: + +``` +$numbers{'Fifth'} = 6; +$numbers{'Fifth'} = 5; +``` + +
+ +
+How can you iterate an array? And a hash?
+ +- Array: + +``` +my @numbers = qw/1 2 3 4 5/; + +# Using `$_` that represents the current iteration in a loop. It starts from index array 0 until the last index. +foreach (@numbers) { + print($_); +} +# Output: 12345 + + +# "$#" returns the max index of an array. That's the reason because we can iterate accesing to the array from the index 0 to the max index. +for my $i (0..$#numbers) { + print($numbers[$i]); +} +# Output: 12345 + + +# Using the `map` keyword: +print map {$_} @numbers; +# Output: 12345 + +# Using `while`. We should take care with this option. When we use `shift` we're deleting the first element of the array and assigning it to the `element` variable. +# After this `loop` the `numbers` array will not have elements. +while (my $element = shift(@numbers)) { + print($element); +} +# Output: 12345 +``` + +- Hashes: + + ``` + my %capital_cities = ( + 'Madrid' => 'Spain', + 'Rome' => 'Italy', + 'Berlin' => 'Germany' +); + +# Iterate and get the `keys`: +foreach my $city (keys %capital_cities) { + print($city . "\n"); +} +# Iterate and get the `values`: +foreach my $country (values %capital_cities) { + print($country . "\n"); +} + +# Iterate and get the values and keys (first option): +foreach my $city (keys %capital_cities) { + print("City: $city - Country: $capital_cities{$city}" . "\n"); +} + +# Iterate and get the values and keys (first option): +while(my ($city, $country) = each %capital_cities) { + print("City: $city - Country: $capital_cities{$city}" . "\n"); +} +``` + +
+ +
+What is a Perl subroutine? How to define it?
+ +It's the perl model for user defined functions (this is also called function like other programming languages). We can define a subroute with the keyword `sub`. + +``` +sub hello { + print "hello"; +} +``` + +
+ +
+Describe the different ways to receive parameters in a subroutine
+ +- List assignment: Using the `@_` array. It's a list with the elements that are being passed as parameters. + +``` +sub power { + my ($b, $e) = @_; + return $b ** $e; +} + +&power(2, 3); +``` + +- Individual assigment: We should access to every element of the `@_` array. It starts from zero. + +``` +sub power { + my $b = $_[0]; + my $e = $_[1]; + return $b ** $e; +} + +&power(2, 3); +``` + +- Using `shift` keyword: It's used to remove the first value of an array and it's returned. + +``` +sub power { + my $b = shift; + my $3 = shift; + return $b ** $e; +} + +&power(2, 3); +``` + + +[Source](https://stackoverflow.com/a/21465275/12771230) + +We can also read the best way in the same S.O answer. + +
+ +
+What is lexical and dynamic scoping?
+
+ +
+How to apply referencing and dereferencing?
+
+ +
+Does Perl have conventions?
+ +You can check [perlstyle](https://perldoc.perl.org/perlstyle) + +
+ +
+What is Perl POD? Can you code an example?
+ +From the official [docs](https://perldoc.perl.org/perlpod): + +"Pod is a simple-to-use markup language used for writing documentation for Perl, Perl programs, and Perl modules." + +``` +=item + This function returns the factorial of a number. + Input: $n (number you wanna calculate). + Output: number factorial. +=cut +sub factorial { + my ($i, $result, $n) = (1, 1, shift); + $result = $result *= $i && $i++ while $i <= $n; + return $result; +} +``` + +
+ +### Perl Regex + +
+Check if the word `electroencefalografista` exists in a string
+ +``` +my $string = "The longest accepted word by RAE is: electroencefalografista"; +if ($string =~ /electroencefalografista/) { + print "Match!"; +} +``` +
+ +
+Check if the word `electroencefalografista` does not exists in a string
+ +``` +my $string = "The longest not accepted word by RAE is: Ciclopentanoperhidrofenantreno"; +if ($string !~ /electroencefalografista/) { + print "Does not match!"; +} +``` +
+ + +
+Replace the word `amazing`
+ +``` +my $string = "Perl is amazing!"; +$string =~ s/amazing/incredible/; +print $string; +# Perl is incredible! +``` +
+ +
+Extract `hh:mm:ss` with capturing group `()` in the following datetime
+ +``` +my $date = "Fri Nov 19 20:09:37 CET 2021"; +my @matches = $date =~ /(.*)(\d{2}:\d{2}:\d{2})(.*)/; +print $matches[1]; +# Output: 20:09:37 +``` +
+ +
+Extract all the elements that are numbers in an array
+ +``` +my @array = ('a', 1, 'b', 2, 'c', 3); +my @numbers = grep (/\d/, @array); # Note: \d involves more digits than 0-9 +map {print $_ . "\n" } @numbers; +``` + +
+ +
+Print all the linux system users that starts with d or D
+ +- With a Perl one liner :D +``` +open(my $fh, '<', '/etc/passwd'); +my @user_info = <$fh>; +map { print $& . "\n" if $_ =~ /^d([^:]*)/ } @user_info; +close $fh; +``` + +- Avoiding one-liners + +``` +foreach my $user_line (@user_info) { + if ($user_line =~ /^d([^:]*)/) { + print $& . "\n"; + } +} +``` + +
+ +### Perl Files Handle + +
+Mention the different modes in File Handling
+ +- Read only: `<` +- Write mode. It creates the file if doesn't exist: `>` +- Append mode. It creates the file if doesn't exist: `>>` +- Read and write mode: `+<` +- Read, clear and write mode. It creates the file if doesn't exist: `+>` +- Read and append. It creates the file if doesn't exist: `+>>` + +
+ +
+How to write into a file?
+ +``` +# We can use: +# '>' Write (it clears a previous content if exists). +# '>>' Append. +open(my $fh, '>>', 'file_name.ext') or die "Error: file can't be opened"; +print $fh "writing text...\n"; +close($fh); +``` +
+ +
+How can you read a file and print every line?
+ +``` +open(my $fh, '<', 'file_to_read.ext') or die "Error: file can't be opened"; +my @file = <$fh>; +foreach my $line (@file) { + print $line; +} +``` + +We can use the file handle without assigning it to an array: + +``` +open(my $fh, '<', 'file_to_read.ext') or die "Error: file can't be opened"; + +foreach my $line (<$fh>) { + print $line; +} +``` + +
+ +### Perl OOP + +
+Does Perl have support for OOP?
+ +From the official [docs](https://perldoc.perl.org/perlootut): + +"By default, Perl's built-in OO system is very minimal, leaving you to do most of the work." + +
+ +
+What is the purpose of the bless function?
+ +The function os the `bless` function is used to turning a plain data structure into an object. + +
+ +
+How to create a Perl class? How can you call a method?
+ +- Let's create the package: `Example.pm` + +``` +package Example; + +sub new { + my $class = shift; + my $self = {}; + bless $self, $class; + return $self; +} + +sub is_working { + print "Working!"; +} + +1; +``` + +- Now we can instance the `Example` class and call `is_working` method: + +``` +my $e = new Example(); +$e->is_working(); +# Output: Working! +``` + +
+ +
+Does Perl have inheritance? What is the `SUPER` keyword?
+ +Yes, Perl supports inheritance. We can read about it in the official [docs](https://perldoc.perl.org/perlobj#Inheritance). +We also can read about `SUPER` keyword that is used to call a method from the parent class. It gives an example about how we can apply inheritance. +
+ +
+Does Perl have polymorphism? What is method overriding?
+ +Yes, it has polymorphism. In fact method overriding is a way to apply it in Perl. + +Method overriding in simple words appears when we have a class with a method that already exist in a parent class. + +Example: + +``` +package A; + +sub new { return bless {}, shift; }; +sub printMethod { print "A\n"; }; + +package B; + +use parent -norequire, 'A'; + +sub new { return bless {}, shift; }; +sub printMethod { print "B\n"; }; + +my $a = A->new(); +my $b = B->new(); + +A->new()->printMethod(); +B->new()->printMethod(); + +# Output: +# A +# B +``` + +
+ +
+How can you call a method of an inherited class?
+ +``` +# Class `A` with `printA` method. +package A; + +sub new { return bless {}, shift; }; +sub printA { print "A"; }; + +# Class `B` that extends or use the parent class `A`. +package B; + +use parent -norequire, 'A'; + +sub new { return bless {}, shift; }; + +# Instance class `B` allows call the inherated method +my $b = B->new(); +$b->printA(); +``` +
+ +### Perl OS + +
+What is Perl Open3?
+
+ +### Perl Packages & Modules + +
+What is a Perl package? And a module?
+
+ +
+What is the difference between .pl and .pm extensions?
+
+ +
+What is cpan? And cpanm?
+
+ +
+How can you install a Perl module?
+
\ No newline at end of file