【问题标题】:Perl - Concatenate non-empty stringsperl - 连接非空字符串
【发布时间】:2015-09-13 23:06:26
【问题描述】:

我需要一些帮助来“优化”我的代码,因为我相信有一种更好、更简洁的方法可以做到这一点。我有 6 个变量是通过从更长的字符串中解析出来的:

Year
Make
Model
Color
ColorLower
Style

根据记录,我可能有部分或全部这些变量的详细信息。但是,在大多数情况下,有些是空白的。在填充变量之后,我将它们添加到作为汽车/车辆描述的数据库字段中。

目前我的 if/else 块一个接一个,如果变量的长度非零,则连接描述变量

if (length($Year)>0)
{
    $Description == $Description + " " + Year
}
elsif (length($Make) > 0)
    $Description == $Description + " " + $Make
}   ...and so on

TMTOWTDI 在这里绝对适用,我总是惊叹于专家们提出的优雅的单线。虽然我现在的工作正在发挥作用,但我很想知道是否有一种更短、更紧凑的方法可以最大化我的代码。

谢谢大家。

【问题讨论】:

  • 进行字符串连接的方法可能不止一种,但使用+ 并不是其中一种方法。
  • == 也不是赋值的方式。
  • 您还有一个逻辑错误:只有第一个非空字段将附加到$Description,因为您使用的是elsif。不过,我认为这只是伪代码。
  • 我是个笨蛋。我在 C# 和 Perl 之间为这个应用程序来回奔波,这周得到了最好的我。为此,我实际上在 C# 中,因此存在巨大的格式错误。原谅我,伙计们……我很抱歉。
  • 真正的解决方案当然是拆分数据库中的那些字段。像这样存储连接的值违反了 1NF。

标签: string perl if-statement concatenation


【解决方案1】:

大概是这样的:

$desc = join ' ', grep { length $_ > 0 }
  $Year, $Make, $Model, $Color, $ColorLower, $Style;

【讨论】:

  • join ' ', grep length > 0, $Year, $Make, $Model, $Color, $ColorLower, $Style 也可以。
  • 伟大的解决方案.. 一旦我弄清楚我今天正在编码什么语言,我就会实施。我相信其他人会在这些单行中找到美丽。谢谢!
  • 不需要> 0 测试。长度不能为负数,Perl 中 0 为假。 grep { length $_ } 会更惯用。
  • @cjm:很好,所以join ' ', grep length, $Year, ... 就足够了。
【解决方案2】:

不需要长度测试。一个空字符串是 false,所以这会起作用

$desc = join ' ', grep $_, $year, $make, $model, $color, $color_lower, $style;

还值得指出的是,大写字母是为 Perl 全局标识符(例如包名称)保留的。对于母语不是英语的人来说,混合大小写标识符也特别困难,Wikipedia has this to say

“至少一项研究发现,读者可以比CamelCase更快地识别蛇案例值”

【讨论】:

  • 字符串0 也是假的。根据名称,这些变量不太可能为 0,但通常最好说 length,这就是您的意思。
猜你喜欢
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多