Как насчет этого?
def all_occurences(file, str):
initial = 0
file = file.replace('\n', ' ')
while True:
initial = file.find(str, initial)
if initial == -1: return
yield initial
initial += len(str)
карп дает Вам больше информации как, туда, где сообщение прибывает из (контекста)
#!/usr/bin/perl
use Carp;
foo();
bar();
baz();
sub foo {
warn "foo";
}
sub bar {
carp "bar";
}
sub baz {
foo();
bar();
}
, производит
foo at ./foo.pl line 9.
bar at ./foo.pl line 13
main::bar() called at ./foo.pl line 6
foo at ./foo.pl line 10.
bar at ./foo.pl line 14
main::bar() called at ./foo.pl line 19
main::baz() called at ./foo.pl line 7
своего рода глупое для этой небольшой программы, но пригождается, когда Вы хотите знать, кто назвал метод, это - carp'ing.
Я использую warn
для сценариев и простых программ, и Carp
внутренняя часть любые модули. Эти Carp
подпрограммы используют имя файла и номер строки, где Вашу текущую подпрограмму назвали так, легче найти, кто вызывает проблему (не, где проблема проявилась).
Damian рекомендует Carp
вместо warn
в "Создании отчетов об Отказе" в Лучшие практики Perl , но не делает различие между сценариями как конструкции кода верхнего уровня и модули как компоненты то использование программ.
я главным образом не заботился о том в последнее время, потому что я использовал Журнал:: Log4perl для обработки всего этого.
придеритесь работает лучше на отладку в модулях. Если Вы только пишете простой сценарий, нет никакого преимущества. От documenation Карпа:
стандартные программы Карпа полезны в Ваших собственных модулях, потому что они действуют как, умирают () или предупреждают (), но с сообщением, которое, более вероятно, будет полезно для пользователя Вашего модуля. В случае кудахтанья признайтесь, и longmess, что контекст является сводкой каждого вызова в стеке вызовов. Для более короткого сообщения можно использовать карпа или карканье, которые сообщают об ошибке, как являющейся от того, где модуль назвали. Нет никакой гарантии, что это - то, где ошибка была, но это - хорошее образованное предположение.
Carp
ошибки отчетов с точки зрения вызывающей стороны. Это полезно для модулей, где Вы обычно хотите предупредить о неправильном использовании (например, недостающий аргумент) и определить место, где ошибка произошла в противоположность тому, где это было обнаружено. Это особенно важно для служебных функций, которые могли бы использоваться во многих местах.
Большинство авторов использует warn
в сценариях и carp
в модулях. Иногда я использую warn
внутренняя часть модуль, когда я хочу, чтобы сообщение об ошибке отразило проблему в реализации модуля (например, случай, который это должно поддерживать, но не делает.) Спорно, что cluck
было бы лучше в таких ситуациях, поскольку это обеспечивает полный след стека.