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.
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
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
@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. –