在Perl 5中,我可以创建一个到字符串的文件句柄,并且可以像处理文件一样从字符串中读取或写入数据。这对于处理测试或模板非常有用。
例如:
例如:
use v5.10; use strict; use warnings;
my $text = "A\nB\nC\n";
open(my $fh, '<', \$text);
while(my $line = readline($fh)){
print $line;
}
我怎样才能在Perl 6中实现这一点?下面的并不适用于Perl 6(至少对于我运行在64位CentOS 6.5上的MoarVM 2015.01版本和Rakudo Star 2015年1月版的实例来说是不行的):
# 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
我收到了以下错误信息:
No such method 'get' for invocant of type 'Str'
in block <unit> at string_fh.p6:8
Perl5的open(my $fh, '<', \$text)
和Perl6的my $fh = $text;
不同并不奇怪。那么问题是:如何在Perl 6中像Perl 5中的open(my $fh, '<', \$str)
一样从字符串创建虚拟文件句柄?或者这是尚未实现的功能?
更新(在Perl 5中向文件句柄写入)
同样,在Perl 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";
输出:
My string is 'ABC'
我还没有在Perl 6中看到任何类似的东西。
while (my $line ...){...}
并没有以你所想象的方式局部限定$line
的词法作用域。$line
最终的词法作用域是环绕该脚本主要代码体的上下文,并不是仅限于以下大括号内。相反,使用my
声明的词法变量声明作用域只限于封闭的大括号内。相比之下,参数是限定于以下大括号内的,因为这些是对参数进行操作的代码块。在第一个(也是唯一的)答案中的-> $line
代码中的$line
是一个参数。 - raiph$line
是一个未声明的变量,在while
语句之外(use strict; use warnings;
将会揭示这一点),而在P6中它将被识别。 - raiphwhile (my $line = ...
循环,在Perl 6中,你是对的,$line
在循环外有作用域。但是,它在循环外没有值。循环后,$line.say
打印(Any)
,这意味着它在作用域内,但基本上是未定义的。 - Christopher Bottoms$line.say
打印出(Any)
,那么这就是$line
在while
循环语句的条件表达式my $line = ...
中或者在其后续的while
循环语句块中被赋予的最后一个 "值"。注意,在条件表达式周围加上括号是不必要的。 - raiph