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

时间:2018-01-04 07:29:35

标签: perl

我想知道如何在双引号内从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;

3 个答案:

答案 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中的->运算符已重载且具有多个用法:

  1. 如果$hash是哈希引用,$hash->{key}甚至$hash->{'key'}将访问密钥key
  2. 如果$array是数组引用,则$array->[N]将访问索引N
  3. 如果My::Module是模块,则My::Module->member将访问模块中的member。这样,即使未导出,也可以访问模块的任何功能。
  4. 最后,如果$object是对象,$object->member将访问与该对象实例相关的member
  5. 因此$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