Как я могу найти исходное местоположение оператора печати в Perl?

В выбранном ответе была проблема с указанием неправильного времени. Если ваше время 12:30:00 , оно показывает 12:30 AM вместо 12:30 PM . Приведенный ниже код поможет решить эту проблему.

SimpleDateFormat sdf = new SimpleDateFormat("KK:mm:ss");
SimpleDateFormat sdfs = new SimpleDateFormat("hh:mm a");

    Date dt1 = null;

    try {
        dt1 = sdf.parse("12:00:00");
        Log.i("Time in Am Pm  ", sdfs.format(dt1));

    } catch (ParseException e) {
        e.printStackTrace();
    }
9
задан brian d foy 26 May 2009 в 13:00
поделиться

8 ответов

Попробуйте следующее:

#!/usr/bin/env perl

use strict;
use warnings;
use Tie::STDOUT print => sub {
  my ( $pkg, $file, $line ) = caller(2);
  print "$pkg, $file, $line :: ", @_;
};

print "Hello, World\n";

Что дает:

$ perl tp.pl
main, tp.pl, 10 :: Hello, World

Обновление: я только что выпустил Devel :: Ditto :

$ perl -MDevel::Ditto myprog.pl
[main, t/myprog.pl, 9] This is regular text
[main, t/myprog.pl, 10] This is a warning
[MyPrinter, t/lib/MyPrinter.pm, 7] Hello, World
[MyPrinter, t/lib/MyPrinter.pm, 8] Whappen?
15
ответ дан 4 December 2019 в 06:09
поделиться

Использовать Debug :: Trace ( https://metacpan.org/ pod / Debug :: Trace )

#!/usr/bin/perl

foo();
bar();

sub foo {
  print "foo\n";
}

sub bar {
  print "bar\n";
}

Эта программа, сохраненная как test.pl и называемая:

perl -MDebug::Trace=foo,bar test.pl

Распечатывает:

TRACE:  main::foo() called at test.pl line 3 package main
foo
TRACE:  main::foo() returned
TRACE:  main::bar() called at test.pl line 4 package main
bar
TRACE:  main::bar() returned
8
ответ дан 4 December 2019 в 06:09
поделиться

Копас: Я не могу ответить на ваш комментарий напрямую (еще не достаточно "круто"), но основная проблема в том, что любой проект приличного размера - это не один файл .pl. Это набор модулей, которые собираются вместе.

Ваш код:

a) не обращается ни к чему, кроме одного файла .pl б) не обрабатывает случаи, когда print (...) имеет скобки или другой интервал. c) не справляется со случаями, когда первым аргументом для печати является вызов функции или переменная, а не строка в двойных кавычках. г) подумайте: $ object-> log («Я собираюсь напечатать». foo ($ var). «в консоль»); - ваше регулярное выражение вызовет синтаксическую ошибку: $ object-> log ("Я собираюсь напечатать" Строка 1084:. $ foo ($ var). "на консоль");

Тем не менее, это жизнеспособно для простых скриптов. Это не ПЛОХАЯ идея (в худшем случае, ваш newsource.pl не компилируется), но она не решит эту конкретную проблему, если она не находится в одном файле.

4
ответ дан 4 December 2019 в 06:09
поделиться

Я знал, что исходные фильтры могут быть полезны для чего-то:

C:\Temp> cat DebugFilter.pm
package DebugFilter;

use strict;
use warnings;

use Filter::Simple;

FILTER_ONLY
    code_no_comments => sub {
        s/print/main::mydebugfn();print/g
    };

1;
__END__

C:\Temp> cat DebugPrint.pm
package DebugPrint;

use strict;
use warnings;

use base qw( Exporter );

our @EXPORT = qw( mydebugfn );

sub mydebugfn {
    my ( $pkg, $fn, $line, $sub ) = caller(2);
    warn "print called from: ${sub}(${fn}:${line})\n";
}

1;
__END__

C:\Temp> cat t.pl
#!/usr/bin/perl

use strict;
use warnings;

use DebugFilter;

sub test {
    print STDOUT "print in test\n";
    return;
}

test();

Вот результат:

C:\Temp> perl -MDebugPrint t.pl
print called from: main::test(t.pl:13)
print in test
5
ответ дан 4 December 2019 в 06:09
поделиться

В этой статье объясняется, как подключиться к функции печати Perl: Как я могу подключиться к Perl print?

Он может вам понадобиться, если вы не хотите заменять все операторы print в исходном коде чем-то другим.

4
ответ дан 4 December 2019 в 06:09
поделиться

Я собираюсь оставить альтернативный фильтр источника для справки, потому что он ориентирован на отслеживание вызова одной функции.

Однако решение, похоже, заключается в использовании Devel :: Trace . Это, вероятно, сгенерирует много выходных данных, которые вы можете перенаправить в файл, а затем с помощью grep найти недопустимый результат.

C:\Temp> perl -d:Trace t.pl
>> t.pl:10: T::test();
>> T.pm:5:     print "in T::test\n";
in T::test
>> c:/opt/perl/lib/Config.pm:63: sub DESTROY { }
4
ответ дан 4 December 2019 в 06:09
поделиться

Проще говоря, идентификаторы GUID гарантированно уникальны, потому что они действуют как координаты.

Традиционно * половина специфична для машины (с использованием MAC-адреса), а другая половина - полученный из времени.

Поскольку MAC-адреса уникальны для разных машин, и каждая машина может выполнять одну инструкцию за раз (традиционно помните!), GUID определенно будет уникальным.

Это означает, однако, что если вы откажетесь от любой части GUID, вы теряете гарантию уникальности. Г-н Мартелли дает хорошее объяснение того, почему это большая проблема, чем вы можете предположить.

* Я говорю традиционно, но я никогда не читал статьи, указывающие на серьезные изменения. Я не думаю, что в настоящее время используются настоящие MAC (я полагаю, из соображений безопасности), но я думаю, что они по-прежнему основаны на MAC или, по крайней мере, зависят от машины.

3
ответ дан 4 December 2019 в 06:09
поделиться

Вы можете попробовать использовать Hook :: LexWrap , чтобы разобраться в том, что вызывает что в вашей кодовой базе. Он делает некоторые довольно злые вещи внутри себя, поэтому не будет работать для всех кодовых баз.

1
ответ дан 4 December 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: