我想知道如何从双引号内的size
对象中打印成员File::stat
的值。我可以print "File size: " . $st->size
并得到我想要的东西:
文件大小:4003856350
但如果我print "File size: $st->size"
,我得到:
文件大小:File :: stat = ARRAY(0x15bb4d8) - >大小
我搜索过像“perl print dereference”,“perl print object member”,“perl print arrow operator”等许多其他组合。我尝试过使用$st->{size}
,但是我知道$ st不是哈希。我尝试了$st->[size]
,因为原始错误似乎表明它是一个数组,但我被告知:
使用“严格潜艇”时不允许使用Bareword“尺寸”
似乎应该有一种方法可以在引号内工作,如果是这样,我真的很想知道它是什么。我知道我可以使用printf
来做这个没有连接,但经过这么多的搜索,试验和错误,我的好奇心被激发了。
示例代码:
#!/usr/bin/perl -w
use strict;
use utf8;
use File::stat;
my $st = stat("/path/to/file");
print "File size: $st->size\n";
print "File size: " . $st->size . "\n";
printf "File size: %d\n", $st->size;
你不能把Perl代码放在双引号中并期望它被执行,除非你以某种方式涉及eval EXPR
。
my $x = 4;
my $y = 5;
print "Sum: $x + $y\n"; # Prints Sum: 4 + 5, not Sum: 9.
以下工作:
print "File size: " . $st->size . "\n";
print "File size: ".( $st->size )."\n";
say "File size: " . $st->size;
printf "File size: %s\n", $st->size;
Template->new()->process(\"File size: [% st.size %]\n", { st => $st });
print "File size: ${\( $st->size )}\n";
请避免使用最后一个。这很浪费,它会在列表上下文中计算表达式,即使它看起来像是在标量上下文中调用它(这会导致意外),并且它会使您的代码在实践中的可读性降低。这是上述方法中最不正确的。我只包括它,因为我知道如果不这样做,别人会发布它。
@ikegami提供了足够多的打印方式。但也许你没有在双引号内插入插值的原因尚不清楚。 Perl中的->
运算符超载并且有多个用法:
$hash
是哈希引用,$hash->{key}
甚至$hash->{'key'}
将访问密钥key
。$array
是一个数组引用,$array->[N]
将访问索引N
。My::Module
是一个模块,My::Module->member
将访问模块中的member
。这样,即使未导出,也可以访问模块的任何功能。$object
是一个对象,$object->member
将访问与该对象实例相关的member
。所以$st->size
正在访问size
类型对象的成员File::stat
。在这种情况下,size
是一个在其对象实例$st
上执行的方法(函数)。字符串插值与变量一起发生,因此:
print "File size: $st->size\n";
打印$st
的值,这是File::stat=ARRAY(0x15bb4d8)
(ref的地址可能会有所不同),然后是字符串->size\n
的其余部分。如果我们使用等效的$st->size()
,函数调用将是明确的。
正如所指出的,为了获得函数调用的结果,我们需要将这段代码保留在doble引号之外,例如:
print 'File size: ' . $st->size . "\n";
使用婴儿推车
由Larry Wall发现,1994年。(替代绰号:“购物车”,“婴儿车”,“海龟”)
它几乎可以在任何需要打印方法结果的情况下完成工作:
print "File size: @{[ $st->size ]}\n"