2015-02-24 19 views
8

W Perlu 5, mogę utworzyć uchwyt pliku na łańcuch i odczytać lub zapisać z łańcucha tak, jakby był plikiem. Jest to świetne rozwiązanie do pracy z testami lub szablonami.Potrafię tworzyć uchwyty plików do ciągów w Perlu 5, jak mam to zrobić w Perlu 6?

Na przykład:

use v5.10; use strict; use warnings; 

my $text = "A\nB\nC\n"; 

open(my $fh, '<', \$text); 

while(my $line = readline($fh)){ 
    print $line; 
} 

Jak mogę to zrobić w Perl 6? Poniższy nie praca dla Perl 6 (przynajmniej nie dla mojego wystąpienia Perl6 uruchomiony na MoarVM 2015.01 z January 2015 release of Rakudo Star na 64-bitowych CentOS 6.5):

# Warning: This code does not work 
use v6; 

my $text = "A\nB\nC\n"; 

my $fh = $text; 

while (my $line = $fh.get) { 
    $line.say; 
} 
# Warning: Example of nonfunctional code 

otrzymuję komunikat o błędzie:

No such method 'get' for invocant of type 'Str' 
    in block <unit> at string_fh.p6:8 

to nie jest bardzo zaskakujące, że perl5 na open(my $fh, '<', \$text) nie jest taka sama jak Perl6 na my $fh = $text;. Pytanie brzmi: Jak utworzyć wirtualny uchwyt pliku z łańcucha w Perlu 6, jak open(my $fh, '<', \$str) w Perlu 5? Czy jest to coś, co jeszcze nie zostało wdrożone?

UPDATE (pisząc do uchwytu pliku w Perl 5)

Podobnie można napisać do uchwytów plików smyczkowych w Perlu 5:

use v5.10; use strict; use warnings; 

my $text = ""; 
open(my $fh, '>', \$text); 

print $fh "A"; 
print $fh "B"; 
print $fh "C"; 

print "My string is '$text'\n"; 

Wyjścia:

My string is 'ABC' 

nie mam widziałem coś, co jest zdalnie podobne w Perlu 6, jeszcze.

+1

Btw. kod 'while (mój $ line ...) {...}' nie ma leksykalnych zakresów '$ line' w sposób, w jaki myślisz. Linia '$ line' kończy się leksykalnie w odniesieniu do otaczającego kontekstu, głównej treści skryptu. Nie obejmuje zakresu wewnątrz następujących nawiasów klamrowych. Zamiast tego, leksykalne deklaracje zmiennych używające 'my' są ograniczone do zamkniętych nawiasów klamrowych. Parametry w kontraście * są * ograniczone do następujących nawiasów klamrowych, ponieważ są to blok kodu, który działa na parametry.'$ Line' w kodzie' -> $ line' w pierwszej (jedynej) odpowiedzi poniżej jest parametrem. – raiph

+0

W P5, '$ line' jest niezadeklarowaną zmienną poza instrukcją' while' ('użyj ścisłego, użyj ostrzeżenia;' ujawni to), podczas gdy w P6 będzie to znane. – raiph

+0

@raiph Oh, okay. Teraz widzę, że twój pierwszy komentarz odnosi się całkowicie do Perla 6. Po prostu wypróbowałem pętlę 'while (moja $ line = ...' w Perlu 6 i masz rację, że '$ line' ma zasięg poza pętlą. nie ma wartości poza pętlą.Po pętli '$ line.say' wypisuje' (Any) ', co oznacza, że ​​jest w zasięgu, ale jest w zasadzie niezdefiniowane. –

Odpowiedz

8

Reading

idiomatyczne sposób odczytać linia po linii jest .lines method, która jest dostępna zarówno Str i IO::Handle.

Zwraca leniwy listy, które można przekazać do for, jak w

my $text = "A\nB\nC\n"; 

for $text.lines -> $line { 
    # do something with $line 
} 

Pisanie

my $scalar; 
my $fh = IO::Handle.new but 
     role { 
      method print (*@stuff) { $scalar ~= @stuff }; 
      method print-nl  { $scalar ~= "\n" } 
     }; 

$fh.say("OH HAI"); 
$fh.say("bai bai"); 

say $scalar 
# OH HAI 
# bai bai 

(Adaptacja #perl6, dzięki Carl Masak.)

Więcej zaawansowane przypadki:

Jeśli potrzebujesz czegoś więcej zmodyfikowany mechanizm do fałszywych uchwytów plików, jest IO::Capture::Simple i IO::String w ecosystem.

Na przykład:

use IO::Capture::Simple; 
my $result; 
capture_stdout_on($result); 
say "Howdy there!"; 
say "Hai!"; 
capture_stdout_off(); 
say "Captured string:\n" ~$result; 
+0

Podoba mi się wartość pedagogiczna użycia jawnego' -> $ foo' bit, ale w praktyce instrukcja 'for ...' często będzie bardziej zwięzła 'dla $ text.lines {.foo } 'gdzie metoda' .foo' jest wywoływana w "it". ("It" jest zmienną '$ _', która jest automatycznie przypisywana tak czy inaczej, gdy pisze się" topicalizers "jak' for'.) – raiph

+1

@raiph Jest to kwestia preferencji. Używałem często '$ _' w Perlu 5, ale teraz wolę bardziej jawne zmienne. Może być nieco bardziej gadatliwy, ale zamierzam zachować łatwość nad zwięzłością. Cieszę się, że Perl 6 to także TIMTOWTDI. –