这是一个场景.您有大量遗留脚本,都使用公共库.所述脚本使用'print'语句进行诊断输出.脚本不允许任何变化 - 它们的范围广泛,得到了批准,并且早已离开了监督和控制的富有成效的山谷.
现在出现了新的需求:现在必须将日志记录添加到库中.这必须自动且透明地完成,标准库的用户无需更改其脚本.公共库方法可以简单地添加日志记录调用; 这是最简单的部分.困难的部分在于这些脚本的诊断输出始终使用'print'语句显示.必须存储此诊断输出,但同样重要的是,处理.
作为此处理的示例,库应仅记录包含"警告","错误","通知"或"注意"字样的打印行.下面的极其琐碎和被控制的示例代码(tm)将记录一些所述输出:
sub CheckPrintOutput
{
my @output = @_; # args passed to print eventually find their way here.
foreach my $value (@output) {
Log->log($value) if $value =~ /warning|error|notice|attention/i;
}
}
Run Code Online (Sandbox Code Playgroud)
(我想避免诸如"实际上应该记录什么","打印不应该用于诊断","perl糟透了"或"此示例有缺陷xy和z'等问题......这是为简洁和清晰而大大简化.)
基本问题归结为捕获和处理传递给print的数据(或任何perl builtin,沿着这些推理线).可能吗?有什么方法干净利落的吗?是否有任何具有钩子的记录模块可以让你这样做?或者它应该像瘟疫一样应该避免,我应该放弃捕获和处理打印输出?
附加:这必须运行跨平台 - 窗口和*nix相似.运行脚本的过程必须保持不变,脚本的输出也必须保持不变.
其他附加:在codelogic的回答评论中提出了一个有趣的建议:
您可以继承http://perldoc.perl.org/IO/Handle.html并创建自己的文件句柄来执行日志记录工作. - Kamil Kisiel
这可能会这样做,有两点需要注意:
1)我需要一种方法将此功能导出到使用公共库的任何人.它必须自动应用于STDOUT,也可能是STDERR.
2) IO :: Handle文档说你不能将它子类化,到目前为止我的尝试都没有结果.是否有任何特殊需要使子类化IO :: Handle工作?标准的'使用基础'IO :: Handle'然后覆盖new/print方法似乎什么都不做.
最终编辑:看起来像IO :: Handle是一个死胡同,但Tie :: Handle可能会这样做.感谢所有的建议; 他们都非常好.我将试试Tie :: Handle路线.如果它导致问题我会回来的!
附录:请注意,在使用了这个之后,我发现如果你没有做任何棘手的事情,Tie :: Handle会起作用.如果您使用IO :: Handle的任何功能与绑定的STDOUT或STDERR,它基本上是一个让它们可靠地工作的废话 - 我找不到一种方法来获得IO :: Handle的autoflush方法来处理我的绑定处理.如果我在绑上手柄之前启用了autoflush,它就能正常工作.如果这对您有用,可以接受Tie :: Handle路线.
我更喜欢在大型项目中使用OOP,就像我现在正在研究的那样.我需要在JavaScript中创建几个类,但是,如果我没有弄错的话,至少有几种方法可以做到这一点.什么是语法,为什么会以这种方式完成?
我想避免使用第三方库 - 至少在开始时.
寻找其他答案,我找到了文章面向对象的JavaScript编程,第一部分:继承 - Doc JavaScript,讨论了JavaScript中的面向对象编程.是否有更好的继承方式?
对于java.util中的数组和容器,Java(可能是底层的C-ish代码)的最大容量为Integer.MAX_VALUE(约20亿).是否有其他语言的容量更大的容器?
考虑以下:
<div onclick="alert('you clicked the header')" class="header">
<span onclick="alert('you clicked inside the header');">something inside the header</span>
</div>
Run Code Online (Sandbox Code Playgroud)
如何才能使用户点击跨度时,它不会触发div点击事件?
我正在尝试使用透明的PNG作为我的Java应用程序的图标.JFrame和任务栏上的图像效果很好.但是,当我使用带有TrayIcon的图像时,我会在PNG边缘周围出现黑色哑光背景.
还有其他人遇到过这个问题吗?我真的想使用PNG而不是GIF或JPEG.
我无法在任何地方找到答案,在我开始使用Reflector生成代码之前我认为值得问:
假设我在DataSet中对DataTables运行以下LINQ查询:
var list =
from pr in parentTable.AsEnumerable()
join cr in childTable.AsEnumerable() on cr.Field<int>("ParentID") equals pr.Field<int>("ID")
where pr.Field<string>("Value") == "foo"
select cr;
Run Code Online (Sandbox Code Playgroud)
如果父表与使用显示的关键字段的子表之间存在DataRelation,LINQ会使用它吗?也就是说,它会在父表中找到Value为"foo"的行,然后调用GetChildRows项目子行吗?
或者这是我必须明确指定的内容吗?(如果是这样,我该怎么做?)
以下为什么不工作?
(apply and (list #t #t #f))
Run Code Online (Sandbox Code Playgroud)
虽然以下工作正常.
(apply + (list 1 3 2))
Run Code Online (Sandbox Code Playgroud)
这似乎是R5RS和R6RS的情况?
嗨,我正在寻找一个支付网关,可以进行每月更改的定期结算.Fogbugz这样做,他们根据当月有多少活跃用户收费.我发现的所有API只允许您设置固定金额,并且很难/不可能每月更改订阅金额.
有没有人遇到任何这样做的服务?
我正试图了解DI/IoC,NHibernate并让它们在我正在开发的应用程序中很好地协同工作.我对NHibernate和DI/IoC都很陌生,所以不太确定我所做的是否是合理的方式.这是场景:
该应用程序为用户提供了计算特定金融交易的特定值(称为保证金)的能力.每个事务的marging值的计算是通过抽象MarginCalculator类的具体实现来执行的,并且要使用的具体实现取决于特定事务的产品类型(由产品对象的某个字段给出).具体的计算器类可通过产品类的属性访问.即
public class Transaction
{
private double _margin;
private Product _product;
private Client _client;
public double Margin { get; }
public Product Product { get; }
public Client Client { get; }
public Transaction(Product p, Client c)
{
_product = p;
_client = c;
}
public void CalculateMargin()
{
_margin = _product.MarginCalculator.CalculateMargin();
}
}
public class Product
{
private string _id;
private string _productType;
... Other fields
public string Id { get; }
public string ProductType { get; } …Run Code Online (Sandbox Code Playgroud) 有没有人知道或者知道vim插件/宏/函数是否能很好地缩进c ++模板?
当我在vim .hpp/.h文件中突出显示模板定义并用'='缩进它时,我得到这样的结果:
> template <
> class TFilter,
> class TParser,
> class TConsumer,
> class TDataProcessor,
> class TDataFeed,
> class TSymbolMap
> >
> struct DataFeedTraits
> {
> typedef TFilter Filter;
> typedef TParser<TSymbolMap> Parser;
> typedef TConsumer<Parser> Consumer;
> typedef TDataProcessor<Filter,Consumer> DataProcessor;
> typedef TDataFeed<Filter,DataProcessor,Parser,Ccnsumer> DataFeed;
> };
Run Code Online (Sandbox Code Playgroud)
我认为cindent将struct/class声明与结束括号">"对齐.我想最终得到类似的东西,或类似的,确切的格式无关紧要,只要格式化:
template <
class TFilter,
class TParser,
class TConsumer,
class TDataProcessor,
class TDataFeed,
class TSymbolMap
>
struct DataFeedTraits
{
typedef TFilter Filter;
typedef TParser<TSymbolMap> Parser;
typedef …Run Code Online (Sandbox Code Playgroud) c# ×2
javascript ×2
c++ ×1
capacity ×1
class ×1
containers ×1
datarelation ×1
dataset ×1
dom ×1
events ×1
hook ×1
html ×1
indentation ×1
java ×1
join ×1
linq ×1
nhibernate ×1
oop ×1
perl ×1
png ×1
pretty-print ×1
printing ×1
scheme ×1
templates ×1
tie ×1
transparency ×1
trayicon ×1
vim ×1