正确的方法是:在perl中打印“文件大小:$ st-> size”?

问题描述 投票:4回答:3

我想知道如何从双引号内的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
3个回答
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";

请避免使用最后一个。这很浪费,它会在列表上下文中计算表达式,即使它看起来像是在标量上下文中调用它(这会导致意外),并且它会使您的代码在实践中的可读性降低。这是上述方法中最不正确的。我只包括它,因为我知道如果不这样做,别人会发布它。


0
投票

@ikegami提供了足够多的打印方式。但也许你没有在双引号内插入插值的原因尚不清楚。 Perl中的->运算符超载并且有多个用法:

  1. 如果$hash是哈希引用,$hash->{key}甚至$hash->{'key'}将访问密钥key
  2. 如果$array是一个数组引用,$array->[N]将访问索引N
  3. 如果My::Module是一个模块,My::Module->member将访问模块中的member。这样,即使未导出,也可以访问模块的任何功能。
  4. 最后,如果$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";

0
投票

使用婴儿推车

由Larry Wall发现,1994年。(替代绰号:“购物车”,“婴儿车”,“海龟”)

它几乎可以在任何需要打印方法结果的情况下完成工作:

print "File size: @{[ $st->size ]}\n"

见:Perl Secrets

© www.soinside.com 2019 - 2024. All rights reserved.