
# Comentários de uma linha começam com um sinal de número.

#### Tipos de variáveis em Perl

# Variáveis iniciam com um sigilo, que é um símbolo que mostra o tipo.
# Um nome de variável válido começa com uma letra ou sublinhado,
# seguido por qualquer quantidade de letras, números ou sublinhados.

### Perl has three main variable types: $scalar, @array, e %hash.

## Scalars
# Um scalar representa um valor único:
my $animal = "camelo";
my $resposta = 42;

# Valores scalar podem ser strings, inteiros ou números ponto-flutuantes e
# Perl vai automaticamente converter entre eles quando for preciso.

## Arrays
# Um array representa uma lista de valores:
my @animais = ("camelo", "vaca", "boi");
my @números = (23, 42, 69);
my @misturado   = ("camelo", 42, 1.23);

## Hashes
# Um hash representa um conjunto de pares chave/valor:

my %fruta_cor = ("maçã", "vermelho", "banana", "amarelo");

# Você pode usar o espaço em branco e o operador "=>" para colocá-los de
# maneira mais agradável:

my %fruta_cor = (
  maçã  => "vermelho",
  banana => "amarelo",
);

# Scalars, arrays and hashes são documentados mais profundamente em perldata.
# (perldoc perldata).

# Mais tipos de dados complexos podem ser construídos utilizando referências,
# o que permite que você crie listas e hashes dentro de listas e hashes.

#### Condicionais e construtores de iteração

# Perl possui a maioria das construções condicionais e de iteração habituais.

if ($var) {
  ...
} elsif ($var eq 'bar') {
  ...
} else {
  ...
}

unless (condição) {
  ...
}
# Isto é fornecido como uma versão mais legível de "if (!condition)"

# A forma Perlish pós-condição
print "Yow!" if $zippy;
print "Nós não temos nenhuma banana" unless $bananas;

#  while
while (condição) {
  ...
}

# for
for (my $i = 0; $i < $max; $i++) {
  print "valor é $i";
}

for (my $i = 0; $i < @elements; $i++) {
  print "Elemento atual é " . $elements[$i];
}

for my $element (@elements) {
  print $element;
}

# implícito

for (@elements) {
  print;
}

#### Expressões regulares

# O suporte a expressões regulares do Perl é ao mesmo tempo amplo e profundo,
# e é objeto de longa documentação em perlrequick, perlretut, e em outros
# lugares. No entanto, em suma:

# Casamento simples
if (/foo/)       { ... }  # verdade se $_ contém "foo"
if ($a =~ /foo/) { ... }  # verdade se $a contém "foo"

# Substituição simples

$a =~ s/foo/bar/;         # substitui foo com bar em $a
$a =~ s/foo/bar/g;        # substitui TODAS AS INSTÂNCIAS de foo com bar em $a

#### Arquivos e I/O

# Você pode abrir um arquivo para entrada ou saída usando a função "open()".

open(my $in,  "<",  "input.txt")  ou desistir "Não pode abrir input.txt: $!";
open(my $out, ">",  "output.txt") ou desistir "Não pode abrir output.txt: $!";
open(my $log, ">>", "my.log")     ou desistir "Não pode abrir my.log: $!";

# Você pode ler de um arquivo aberto usando o operador "<>". No contexto
# scalar, ele lê uma única linha do arquivo, e em contexto de lista lê o
# arquivo inteiro, atribuindo cada linha a um elemento da lista:

my $linha  = <$in>;
my @linhas = <$in>;

#### Escrevendo subrotinas

# Escrever subrotinas é fácil:

sub logger {
  my $mensagem = shift;

  open my $arquivo, ">>", "my.log" or die "Não poderia abrir my.log: $!";

  print $arquivo $ensagem;
}

# Agora nós podemos usar a subrotina como qualquer outra função construída:

logger("Nós temos uma subrotina de log!");

