Przetwarzanie języka naturalnego Temat: Zaawansowane typy danych i Zadania: Data:
ich persystencja
2 Autor: Paweł Kopeć
1 2
3
4
5
6
7
13 X 2014
Autor: Adrian Makuch
e e
e
m h
m
17:30-19:45
Zadanie 1. Tablice
Zadanie polegało na utworzeniu tablicy oraz wypisaniu jej na ekran monitora.
#!/usr/bin/perl -w
@tablica = ('ASK','Logika','PJN','Seminarium','GAIT'); foreach(@tablica){
print "$_,"
}
$, = ";";
print "\n";
print "@tablica";
$" = ',';
print "\n";
print "@tablica";
print "\n";
Zadanie 2. Hash
Program ma na celu pobranie od użytkownika wartości o typie klucz -> wartość i zapisanie ich w tablicy hash
#!/usr/bin/perl
%tablica = ();
for($i=0;$i<5;$i++){
print "podaj hashtag i wartość odzielone enterem\n"; my $pierwsza = <STDIN>;
my $druga = <STDIN>;
chomp ($pierwsza);
chomp($druga);
$tablica{$pierwsza} = $druga;
}
@hashe = keys(%tablica);
#chomp(@hashe);
foreach(@hashe){
print "$_---$tablica{$_}\n";
}
Program jest rozwinięciem poprzedniego. Różnica jest taka, że pola klucz-wartość są podawane jako jeden ciąg słów i należy je rozdzielić za pomocą wyrażeń regularnych.
#!/usr/bin/perl
%tablica = ();
for($i=0;$i<5;$i++){
print "podaj hashtag i wartość odzielone kropka\n"; my $pobrane = <STDIN>;
chomp ($pobrane);
$pobrane =~ /(\D+)(\.)(\D+)/;
$tablica{$1} = $3;
}
@hashe = keys(%tablica);
#chomp(@hashe);
foreach(@hashe){
print "$_---$tablica{$_}\n";
}
Zadanie 4. Sprawdź istnienie
Program ma za zadanie przeanalizować pola w tablicy hashy za pomocą funkcji exist() oraz defined().
#!/usr/bin/perl
my %plan = (
"Poniedzialek" => {
"ASK-WYK" => "07:30-09:45",
"ASK-LAB" => "14:30-16:45",
"PJN-lab" => "17:45-20:15"},
"Wtorek" => {
"Logika-WYK" => "07:30-09:45"},
"Sroda" => {
"PJN-WYK" => "11:00-13:15",
"Seminarium" => "14:00-16:15"},
"Czwartek" => "brak",
"Piatek" => {
"GAiTT-LAB"=>"10:00-12:00",
"GAiTT-wyklad"=>"18:00-20:15"},
"Sobota" => undef,
"Niedziela" => undef
);
print "Poniedziałek (exist): " . exists($plan{Poniedzialek})."\n"; print "Poniedziałek (defined): " .
defined($plan{Poniedzialek})."\n"; print "Sobota (exist): " .exists($plan{Niedziela})."\n"; print "Sobota (defined): " .defined($plan{Niedziela})."\n"; Jeżeli warunek uwzględni funkcję exists() wówczas dla zdefiniowanych kluczy oraz dla undef będzie zwrócone 1 natomiast jeżeli warunek uwzględni funkcję defined() to tylko dla zdefiniowanych kluczy będzie zwrócone 1
Program ma za zadanie utworzyć drzewo binarne, po czym zapisać jego strukturę do pliku tekstowego.
#!/usr/bin/perl -w
use strict;
open(PLIK, ">plik.txt") || die "Nie można otworzyć pliku"; my($trunk, $n);
while ($n++ < 20) { insert($trunk, int(rand(1000)))}
print PLIK "Pre order: "; pre_order($trunk); print PLIK "\n"; print PLIK "In order: "; in_order($trunk); print PLIK "\n"; print PLIK "Post order: "; post_order($trunk); print PLIK "\n"; close PLIK;
exit;
sub insert {
my($drzewo, $val) = @_;
unless ($drzewo) {
$drzewo = {};
$drzewo ->{VALUE} = $val;
$drzewo ->{LEFT} = undef;
$drzewo ->{RIGHT} = undef;
$_[0] = $drzewo;
return;
}
if ($drzewo ->{VALUE} > $val) {
insert($drzewo ->{LEFT}, $val)
}elsif ($drzewo ->{VALUE} < $val) {
insert($drzewo ->{RIGHT}, $val)
}else{
warn "dup insert of $val\n"
}
}
sub in_order {
my($drzewo) = @_;
return unless $drzewo;
in_order($drzewo ->{LEFT});
print PLIK $drzewo ->{VALUE}, " "; in_order($drzewo ->{RIGHT});
}
sub pre_order {
my($drzewo) = @_;
return unless $drzewo;
print PLIK $drzewo ->{VALUE}, " "; pre_order($drzewo ->{LEFT});
pre_order($drzewo ->{RIGHT});
}
sub post_order {
my($drzewo) = @_;
return unless $drzewo;
post_order($drzewo ->{LEFT});
post_order($drzewo ->{RIGHT});
print PLIK $drzewo ->{VALUE}, " ";
}
Zadanie 7. Propozycja ćwiczenia Implementacja prostego tłumacza dla paru słów. Zdanie dzielone jest na poszczególne słowa następnie zapisywane w tablicy hash. Następnie słowo jest zamieniane na odpowiadające mu w innym języku.
#!/usr/bin/perl -w
%polish2english = (
go => "idę",
to => "do",
home => "domu"
regular => "regularne"
);
%english2polish = reverse %polish2english;
do{
print "Podaj zdanie do przetlumaczenia \n> "; $line = <>;
if($line =~ /\w/){
$line =~ s/^\s*//;
$line =~ s/\s*$//;
@words = split /\s+/, $line;
foreach $word ( @words ){
if(exists($dutch2english{$word})){
print "$polish2english{$word} ";
}
elsif(exists($english2dutch{$word})){
print "$english2polish{$word} ";
}
else{
print "[$word] "; # unknown
}
}
print "\n";
}
}while($line =~ /\w/);