【发布时间】:2016-06-28 14:22:02
【问题描述】:
我不知道如何检查这个。如果传入的第一个参数是字符串,我的方法(如果方法中的条件)应该只工作(执行)。我知道如何检查其他类型,但我似乎找不到任何检查字符串的方法。
对于哈希,我会做类似的事情;
if(ref eq 'HASH') {...}
如果有人可以提供一个简单的示例,我相信我可以将它应用到我正在做的事情中。如果需要,我将提供该方法的代码和该方法的整个操作细节的解释。
添加信息
这是一种在软件中处理不同类型错误的方法,这里有 3 种可能的输入格式:
$class->new("error string message")
$class->new("error string message", code => "UNABLE_TO_PING_SWITCH_ERROR")
$class->new("error string message", code => "UNABLE_TO_PING_SWITCH_ERROR", switch_ip => $ip3, timeout => $timeout)
-
总是会先出现错误信息字符串。
-
对于第一种情况,还有一个 hashref 指向位于库中的错误哈希结构, 如果单词“code”作为 arg 存在,则此方法 new 将进入模板处理。构造更详细的错误消息的位置。 (我已经有了这个逻辑)。
-
但我必须添加逻辑,以便将错误消息字符串添加到哈希中,因此输出是一个哈希,而不是字符串。
-
第二种情况与第一种情况非常相似,其中有参数,例如。 switch_ip ,使用类似的模板处理逻辑插入到字符串中,(也有这个)。
-
所以我认为第一种和第二种情况可以用相同的方式处理,但我不确定,所以在这个问题中将它们分开。
-
最后一种情况是错误消息字符串本身,我只是将它插入到一键消息哈希 { message => "error string} 中。
所以毕竟我应该如何检查或划分这些错误案例,目前我对带有代码的案例的想法是将参数转储到哈希中,然后使用类似的东西:
if(exists($param{code}) { doTemplateProcess()...}
我需要确保首先传入一个字符串。这是我最初的问题。我的任何上下文信息有帮助吗?我希望我没有偏离我的问题的主题,如果是这样,我会提出一个新问题。谢谢。
错误哈希 - 位于 Type.pm
use constant ERROR_CODE => {
UNABLE_TO_PING_SWITCH_ERROR => {
category => 'Connection Error:',
template => 'Could not ping switch %s in %s minutes',
tt => {template => 'disabled'},
fatal => 1,
wiki_page => www.error-solution.com/,
},
}
来自 cmets:
这些将像这样在软件的代码中调用
ASC::Builder::Error->new(
"Phase x this occured because y was happening:",
code => UNABLE_TO_PING_SWITCH_ERROR,
switch_ip => $ip3,
timeout => 30,
);
【问题讨论】:
-
这是一种不好的做法。在 Perl 中,最好不要尝试确定值的类型。你会破坏一些东西。相反,使用不同的方法名称、命名选项、参数数量的差异等。
-
您实际上想要完成什么?除了检查“它是一个字符串”之外,还有其他方法可以验证您的输入。您可能应该使用其中之一。 (例如,匹配正则表达式可能是一个不错的选择)
-
每个标量要么是一个字符串,要么可以通过用作字符串而变成一个。说你的方法需要一个字符串并没有真正说明什么。你想确保参数不是参考吗?然后使用
ref。想确定不是undef?然后使用defined。如果您试图区分字符串和数字 - 您希望foo(6)失败而foo("6")成功? - 那么答案是请不要那样做。这很难做到,因为这不是一个好主意。 -
我一直将条件除以偶数个参数,奇数个参数后跟只有一个参数,但我的导师/顾问说我不应该根据参数的位置。我会向您展示将传递给我的方法的不同输入类型/案例吗?我将编辑我的问题,如果我提供一些上下文可能会更清楚?匹配正则表达式,我还没有看到它是如何工作的,但它可能是一个选项
-
如果您扩展您正在获得的内容以及您想要完成的内容,我们可能会给出更好的答案。非常正确,您不应该依赖参数的“硬定位”(除非“超过几个”)。稍后传入“键值”以转换为散列效果很好,“只是”迭代类似的对象列表也是如此。
标签: string perl if-statement