我想知道如何在双引号内从size
对象打印成员File::stat
的值。我可以print "File size: " . $st->size
得到我想要的东西:
文件大小:4003856350
但如果我print "File size: $st->size"
,我得到:
文件大小:File :: stat = ARRAY(0x15bb4d8) - > size
我搜索了诸如“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;
答案 0 :(得分:4)
你不能将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";
请避开最后一个。这很浪费,它会在列表上下文中评估表达式,即使它看起来像是在标量上下文中调用它(这会导致意外),并且它会使您的代码在实践中的可读性降低。这是上述方法中最不正确的。我只包括它,因为我知道如果我不知道别人会发布它。
答案 1 :(得分:0)
@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)
(引用的地址可能不同),然后是字符串->size\n
的其余部分。如果我们使用等效的$st->size()
,函数调用将是明确的。
正如所指出的,为了获得函数调用的结果,我们需要将这段代码保留在doble引号之外,例如:
print 'File size: ' . $st->size . "\n";
答案 2 :(得分:0)
使用婴儿车
由Larry Wall发现,1994年。(替代绰号:"购物推车","婴儿车","海龟")
它几乎可以在任何需要打印方法结果的情况下完成工作:
print "File size: @{[ $st->size ]}\n"
请参阅:Perl Secrets