Odczyt/zapis plików w Perlu

0

Ostatnio nauczyłem się korzystać z plików w języku Perl w taki sposób:

  • Zapis do pliku
print "Podaj tekst: ";
$tekst=<STDIN>;
chomp $tekst;
open($mojplik,"+>","mojplik1.txt");
print $mojplik $tekst;
print "Tekst zapisany w pliku.\n";
close $mojplik;
  • Odczyt z pliku (działa nawet bez chomp, co trochę mnie dziwi)
open($mojplik,"<","mojplik1.txt");
$contents=<$mojplik>;
print "Plik zawiera $contents.\n";

Oby dwa programy działają tylko mam problem bo nie wiem jak odczytać z pliku więcej linii. Wprawdzie na http://javatpoint.com jest taki kod:

my $filename = 'file1.txt';  
open(my $fh, '<:encoding(UTF-8)', $filename)  
  or die "Could not open file '$filename' $!";  
while (my $row = <$fh>) {  
  chomp $row;  
  print "$row\n";  
}  
print "done\n";

Ale co zrobić kiedy nie chcę wypisywać linii z pliku tylko zgromadzić je w tablicy i wykorzystać później?

3

Tak samo jak tu $contents=<$mojplik>; tylko zamiast kontekstu skalara, w kontekst listy

open FILE, '</etc/passwd';
@lines = <FILE>;

foreach $line (@lines) {
    print $line;
}

Nie, nie napisałem tego z pamięci, zajrzałem do książki z lamą, która się gdzieś poniewierała po szufladzie.

1
Spearhead napisał(a):

Tak samo jak tu $contents=<$mojplik>; tylko zamiast kontekstu skalara, w kontekst listy

open FILE, '</etc/passwd';
@lines = <FILE>;

foreach $line (@lines) {
    print $line;
}

Nie, nie napisałem tego z pamięci, zajrzałem do książki z lamą, która się gdzieś poniewierała po szufladzie.

A gdyby potem okazało się, że wszystkie linie chce się potraktować jako całość, można zrobić tak:

my $fileContent = join "\n", @lines;
0

A musi być taka dziwna postać instrukcji open FILE, '</etc/passwd'; czy mogę zrobić normalnie open($mojplik,"<","mojplik2.txt");?

1
Manna5 napisał(a):

A musi być taka dziwna postać instrukcji open FILE, '</etc/passwd'; czy mogę zrobić normalnie open($mojplik,"<","mojplik2.txt");?

Może być tak i tak - obie formy robią to samo.

0

To jest właśnie niemądra rzecz w Perlu - jednym z selling points języka i jego motywem przewodnim było "jest więcej niż 1 sposób na zrobienie dowolnej rzeczy". Przykładem tego jest właśnie opcjonalność nawiasów okrągłych w wywołaniach funkcji. Zarówno print "Test" jak i print("Test") działają to samo. W praktyce okazało się jednak, że prowadzi to do czynienia i tak nieczytelnego języka jeszcze bardziej nieczytelnym, bo każdy programista pisał po swojemu, przez co zamiast jednolitego stylu programistycznego zrozumiałego dla każdego powstały miliony osobnych dialektów.

0

Jeśli chodzi o mnie to ja robię print i chomp bez nawiasów a resztę funkcji z nawiasami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1