如何在Mojolicious中获取准确的caller()?

问题描述 投票:0回答:1

如何获取 Mojolicious 的堆栈跟踪来反映物理源代码?

例如,执行以下代码时:

/foo/bar/app.pl:

 1 #!/usr/bin/env perl
 2 use Mojolicious::Lite;
 3
 4 get '/' => sub {
 5   my $c = shift;
 6
 7   my ($package, $filename, $line, $subroutine, $hasargs, $wantarray,
 8     $evaltext, $is_require, $hints, $bitmask, $hinthash) = caller(0);
 9
10   $c->render(text =>
11     'p=' . $package    . ',' .
12     'f=' . $filename   . ',' .
13     'l=' . $line       . ',' .
14     'm=' . $subroutine
15   );
16 };
17
18 app->start;

实际:

# /foo/bar/app.pl daemon

p=Mojolicious,f=/usr/local/share/perl5/Mojolicious.pm,l=202,m=main::__ANON__

# morbo /foo/bar/app.pl

p=Mojolicious,f=/usr/local/share/perl5/Mojolicious.pm,l=202,m=Mojo::Server::Sandbox::b89e17a47746799cd9250564e1c58531::__ANON__

预计:

f=/foo/bar/app.pl
l=7
m=main::__ANON__
perl mojolicious
1个回答
0
投票

caller
主要提供当前子进程的caller信息。


解决方案1

use feature qw( current_sub say );
use Sub::Util qw( subname );

sub f {
   say join "|", __PACKAGE__, __FILE__, __LINE__, subname( __SUB__ );
}

f();
main|a.pl|5|main::f

解决方案2

use feature qw( say );

sub f {
   say join "|", __PACKAGE__, __FILE__, __LINE__, ( caller( 0 ) )[ 3 ];
}

f();
main|a.pl|4|main::f

解决方案3

use feature qw( current_sub say );

sub self_info { ( caller( 0 ) )[ 0, 1, 2 ], ( caller( 1 ) )[ 3 ] }

sub f {
   say join "|", self_info();
}

f();
main|a.pl|6|main::f
© www.soinside.com 2019 - 2024. All rights reserved.