我正在玩弄lines你从命令行中指定的文件中读取行:
for lines() { put $_ }
Run Code Online (Sandbox Code Playgroud)
如果它无法读取它抛出的X::AdHoc其中一个文件名(有一天它可能会有更好的异常类型,因此我们可以使用.path方法获取文件名).很好,所以赶上:
try {
CATCH { default { put .^name } }
for lines() { put $_ }
}
Run Code Online (Sandbox Code Playgroud)
所以这就抓住了X::AdHoc错误,但就是这样.该try块在那时完成.它不能.resume并尝试下一个文件:
try {
CATCH { default { put .^name; .resume } } # Nope
for lines() { put $_ }
}
Run Code Online (Sandbox Code Playgroud)
回到Perl 5的土地,你得到一个关于坏文件名的警告,程序继续下一步.
如果有一些参数,我可以@*ARGS先过滤然后重建$*ARGFILES:
$*ARGFILES = IO::CatHandle.new:
@*ARGS.grep( { $^a.IO.e and $^a.IO.r } ) if +@*ARGS;
for lines() { …Run Code Online (Sandbox Code Playgroud) 我有两个代码,我认为应该是等价的.第一个用于<|w>指定字边界,其中非字字符(或字符串的开头)应该在H之前.第二个例子使用了<<,它应该做同样的事情.
my $string = 'Hamadryas perlicus';
say $string ~~ /
<?after <|w> Hamadryas \s+ >
(\w+)
/;
say $string ~~ /
<?after << Hamadryas \s+ >
(\w+)
/;
Run Code Online (Sandbox Code Playgroud)
第一个匹配,但第二个不匹配:
?perlicus?
0 => ?perlicus?
Nil
Run Code Online (Sandbox Code Playgroud)
这两个还有其他一些区别吗?
主要是为了创建合理的示例,我想知道哪些数据结构和rountes可用于Perl6的native界面,如
class a-class is repr('CStruct') { has int $.whatever; }
class another-class is repr('CPPStruct') { has int $.whateverelse; }
sub a_native_function( another-class $object ) is native {*};
Run Code Online (Sandbox Code Playgroud)
有没有办法列出它们?我想特别获取C++函数和数据结构的示例,这样我就不必创建和编译外部库来创建示例.
在尝试公开localtimePerl 6中的功能时,我似乎做错了什么:
use NativeCall;
my class TimeStruct is repr<CStruct> {
has int32 $!tm_sec;
has int32 $!tm_min;
has int32 $!tm_hour;
has int32 $!tm_mday;
has int32 $!tm_mon;
has int32 $!tm_year;
has int32 $!tm_wday;
has int32 $!tm_yday;
has int32 $!tm_isdst;
has Str $!tm_zone;
has long $!tm_gmtoff;
}
sub localtime(uint32 $epoch --> TimeStruct) is native {*}
dd localtime(time); # segfault
Run Code Online (Sandbox Code Playgroud)
跑下perl6-lldb-m,我得到:
Process 82758 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x5ae5dda1)
frame #0: 0x00007fffe852efb4 libsystem_c.dylib`_st_localsub …Run Code Online (Sandbox Code Playgroud) 可以通过以下几种方式调用函数:
say(1, 2, 3) # 123
say: 1, 2, 3 # (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
后者似乎通过了Positional,但除此之外,我不知道他们有何不同.是否有任何重要的差异需要知道?你会使用哪种类型的情况?
在试图更好地理解无格变量以及它们与$sigiled变量的区别时,我发现,与$sigiled变量不同,sigilless变量在初始化后无法反弹:
my $a = 42;
my $b := $a;
$b := 42; # No exception generated
my \c := $a;
c := 42; # OUTPUT: «Cannot use bind operator with this left-hand side?»
Run Code Online (Sandbox Code Playgroud)
这是设计的吗?如果是这样,当$不禁止这些变量被禁止时,是否有目的或好处禁止无重复变量重新绑定?
有没有一种方便的方法来处理C typedef,它可能在各种平台上有不同的价值?
例如
#if defined(_WIN32)
#define foo_t int32_t
#elif defined(_WIN64)
#define foo_t int64_t
#else
#define foo_t long
#endif
void handle_foo(foo_t* in) {
...
}
Run Code Online (Sandbox Code Playgroud)
目前我在Perl 6中处理这个问题
sub handle_foo32(int32 is rw) is native(Str) { * }
sub handle_foo64(int64 is rw) is native(Str) { * }
sub handle_foo00(long is rw) is native(Str) { * }
sub handle-foo(Int $in) {
if $*DISTRO.is-win {
given $*KERNEL.bits {
when 32 {
handle_foo32(my int32 $ = $in);
}
when 64 {
handle_foo64(my int64 $ = $in); …Run Code Online (Sandbox Code Playgroud) 鉴于:
sub abc(Int $n) { say $n }
Run Code Online (Sandbox Code Playgroud)
如果我们传递一个类型的变量Str,abc我们会得到一个编译时错误:
my Str $s = "123"; abc $s;
Run Code Online (Sandbox Code Playgroud)
如果我们传递一个包含字符串的无类型变量,我们会收到运行时错误:
my $s = "123"; abc $s;
Run Code Online (Sandbox Code Playgroud)
C++支持auto允许类型推断的关键字.
是否可以auto在Perl 6中定义类似于:
auto $s = "123";
Run Code Online (Sandbox Code Playgroud)
会导致$s输入Str?
即,我们可以做到以下几点:
auto $s = "123"; abc $s;
Run Code Online (Sandbox Code Playgroud)
并得到一个编译时错误.
如果您创建一个类:
class Foo { }
Run Code Online (Sandbox Code Playgroud)
该类将继承其所有方法Any,然后Mu.
我想创建一个不从任何其他类继承的类:它应该包含一个FALLBACK方法,该方法应该捕获对该对象实例的所有方法调用.
我查看了MetaModel代码,但似乎没有一种简单的方法来实现这一目标.欢迎所有建议!
更新:我决定采用Jonathan Worthington所描述的拦截任何方法调用方式.这导致CPAN上有两个新的Perl 6模块:InterceptAllMethods和Object :: Trampoline.
我们来看一个Java的例子byte[] data.在Perl的方法签名中,我可以做,method myMethod($data)但这是一种有用的动态类型.
但是,我希望操作一个字节数组 - 那么有没有一种首选的方法将数据类型转换为字节数组或远程类似的东西?
我环顾四周,看到这里的代码将源数据转换为字节数组:
my $arr = Buf.new('mystring'.encode('utf-8'));
say $arr;
Run Code Online (Sandbox Code Playgroud)
这只是我的方法的首选输入,它将Buf通过$data方法变量进行操作吗?