#12in24: Learning Perl in 4h.
Tags: perl, codenewbie
Published: 2024-01-24 16:00:00

The title is pretty clickbaiting. But read me out: **Yes, you can learn a new language in just 4 hours.** Other thing is mastering it...

So, as this is the first language of my **#12in24**, I wanted to start small. **I will use this video to learn the basics: [Perl Programming Course for Beginners](https://youtu.be/_DFa26ep-h4?si=1TuCkUKxqUUY4nLQ)**.

## The basics

### File structure
```perl
#!/usr/bin/env perl
# Good ol' shebang

use strict; # This does not allow execution if errors
use warnings; # This prints the errors in console

print "DEV community is cool!"; # The actual program

1; # Not always present, indicates that compilation succeeded
# Don't forget ; at the end of the lines
```

### Data types: Scalars
```perl
my $number = 1;
my $decimal = 3.14;

print $number + $decimal; # 4.14
print $number - $decimal; # -2.14
# ...

my $string = "Follow me "; 
my $string2 = "on dev.to!";

print $string . $string2; # Follow me on dev.to!

# Variables are case sensitive
my $variable = 1;
# is different to
my $Variable = 1;

# To declare a global variable
our $global_variable = 5;
```

![Bugs Bunny Communist declaring a global variable in Perl](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0b75d5eskfa2s6ggdls7.png)

### Data types: Arrays
```perl
my @array = (
    1,
    "two",
    3.14
);

print @array;
# $VAR1 = 1;
# $VAR2 = "two";
# $VAR3 = "3.14";

print $array[0]; # This will print 1
my $size = @array; 
print $size; # This will print $VAR1 = 3;

my @array2 = ( 3 .. 7 );
# $VAR1 = 3;
# $VAR2 = 4;
# $VAR3 = 5;
# $VAR4 = 6;
# $VAR5 = 7;
# If you use (  "a" .. "d" ) it will print each letter from a to d
# You can use it for array indexes as well

push @array2, 8; # Adds number 8 to the array
pop @array; # Removes last element
shift @array; # Removes first element
unshft @array, 0; # Adds element at the beginning
```

### Subroutines
```perl
sub my_function {
    $hi = "Hello";
}
print my_function(); # This will print Hello

sub my_name( $name ) {
    print $name;
}
my_name("Alex"); # This will print Alex
```

### Conditionals
```perl
$test = 3;

if ( $test > 1 ) {
    print "Hi!";
} 
elsif ( $test < 4 ) {
    print "How are you?";
}
else {
    print "Goodbye!";
}
```

### Loops
```perl
$test = 0;

while ( $test < 5 ) {
    print "Count: $test";
    $test++;
} 
# Count: 0
# Count: 1
# Count: 2
# Count: 3
# Count: 4

for ( my $count = 0; $count < 3; $count++; ) {
    print "Hello"
}
# Hello
# Hello
# Hello
```

The video covers way more than this, I know, but these are the basics. With a little help of the documentation, I will be fine for the next sections.

## Practice

Now, I will put my knowledge to test using [Exercism](https://exercism.org/tracks/perl5/exercises).

Starting here!

### Hello World
{%embed https://exercism.org/tracks/perl5/exercises/hello-world/ %}

**I must say that Exercism complicates way too much the exercises. But anyway, it's not bad to practice.**

## Project

I wanted to do something related to Cybersecurity but not too complex as I am new to Perl. After some deliberation, I came up with this:

**A very simple SQLi Vulnerability Finder.** It is simple as it is just a PoC but can be enhanced to be usable just by adding payloads and places to check.

```perl
#!/usr/bin/env perl

use strict;
use warnings;
use LWP::UserAgent;

sub check_sql_injection {
    my ($url) = @_;

    my $payload = "' OR '1'='1";
    my $test_url = $url . "?id=" . $payload;

    my $ua = LWP::UserAgent->new;
    my $response = $ua->get($test_url);

    if ($response->content =~ /error in your SQL syntax/i) {
        return "Vulnerable to SQL Injection: $url";
    } else {
        return "Not Vulnerable: $url";
    }
}

# Prompt the user for the target URL
print "Enter the target URL: ";
my $target_url = <STDIN>;
chomp $target_url;  

# Example usage:
my $result = check_sql_injection($target_url);
print $result, "\n";
```

Hope you enjoyed it! See you next month learning **COBOL**.