# Perl Test
# By saul-bt
# PUBLIC DOMAIN

use strict;
use warnings;

## REFERENCES ##
my @colors = ("red", "green", "blue");

# '\' can be used to get a reference
my $colorsRef = \@colors;

my %superHash = (
    "colors" => $colorsRef,
    # Also you can create an anonymous
    # array with '[]' ({} for hashes)
    # that returns the reference
    "numbers" => [1, 2, 3]
);

# Now the hash stores something like
# this: ("colors", ARRAY(0x...),
#        "numbers", ARRAY(0x...))

# And you can access these arrays with:
print qq(@{$superHash{"colors"}}\n);

# To print an element:
print qq(${$superHash{"numbers"}}[0]\n);
print $superHash{"colors"} -> [0], "\n";

# Size of array:
print scalar @{$superHash{"colors"}};


## ARRAYS ##
%meh1 = (num => 0, val => 4);
%meh2 = (
    num => 1,
    val => 3
);

@mehs = (\%meh1, \%meh2);

print $mehs[0]{val};


## HANDLERS & HEREDOC ##
print "What's your name? ";
$name = <STDIN>;
chomp($name);

print <<WELCOME;

Hi $name, Where are you from?
WELCOME

$place = <STDIN>;
chomp($place);

print <<GOODBYE;

Oh, you are $name from $place...
I hear that $place is a beautiful place.
It's nice meet people like you $name.
I hope to see you soon :)

Bye $name.
GOODBYE

open (content, "<", "file.txt");

for $line (<content>) {
    print $line;
}

print "What are you looking for? ";
$numResults = 0;
$word = <STDIN>;
chomp($word);

for $line (<>) {
  if ($line =~ m/\b$word\b/i) {
    $numResults += 1;
    print "[$word FOUND]> $line\n";
    next;
  }
  print $line;
}

print "\n\n=== There are $numResults coincidences ===";


## SCRIPT ARGUMENTS ##
$nargs = $#ARGV + 1;

print "There are $nargs arguments:\n";

for $arg (@ARGV) {
    print "- $arg\n";
}

## REGEX STUFF ##
$string = "Perl is cool";

if ($string =~ m/[Pp]erl/) {
  print "Yeah";
}
elsif ($string =~ m(perl)i) {
  print "Sad";
}
else {
  print "MEH";
}

# From my dummy recreation of printf
sub checkTypes {
    my @percents = @{scalar(shift)};
    my @args = @{scalar(shift)};
    my $size = scalar(@percents);

    foreach my $n (0..$size - 1) {
        my $currArg = $args[$n];
        my $currFormat = substr($percents[$n],-1);
	
        $currFormat eq 's' && $currArg =~ m/^\D+$/ ||
        $currFormat =~ m/[dx]/ && $currArg =~ m/^\d+$/ ||
        $currFormat eq 'f' && $currArg =~ m/^\d+(?:\.\d+)?$/ or
        die "'$currArg' can't be formatted as '$currFormat'";
    }
}

## WEIRD STUFF (JAPH) ##
# VMS <3
not exp log srand xor s qq qx xor
s x x length uc ord and print chr
ord for qw q join use sub tied qx
xor eval xor print qq q q xor int
eval lc q m cos and print chr ord
for qw y abs ne open tied hex exp
ref y m xor scalar srand print qq
q q xor int eval lc qq y sqrt cos
and print chr ord for qw x printf
each return local x y or print qq
s s and eval q s undef or oct xor
time xor ref print chr int ord lc
foreach qw y hex alarm chdir kill
exec return y s gt sin sort split

@P=split//,".URRUU\c8R";@d=split//,"\nrekcah xinU / lreP rehtona tsuJ";sub p{
@p{"r$p","u$p"}=(P,P);pipe"r$p","u$p";++$p;($q*=2)+=$f=!fork;map{$P=$P[$f^ord
($p{$_})&6];$p{$_}=/ ^$P/ix?$P:close$_}keys%p}p;p;p;p;p;map{$p{$_}=~/^[P.]/&&
close$_}%p;wait until$?;map{/^r/&&<$_>}%p;$_=$d[$q];sleep rand(2)if/\S/;print

''=~('(?{'.('-)@.)@_*([]@!@/)(@)@-@),@(@@+@)'
^'][)@]`}`]()`@.@]@%[`}%[@`@!#@%[').',"})')