【问题标题】:Perl: Strip out part of a string in an arrayPerl:去掉数组中字符串的一部分
【发布时间】:2014-01-29 02:46:59
【问题描述】:

我阅读了所有看起来相似的问题,但没有找到答案。

我看到很多“删除这个或添加那个”,但没有看到“移动到另一个数组......”

这个问题在你们所有人的下方,但我是 Perl Newblet 并且真的可以使用优雅的解决方案帮助。

我有一个包含未知元素的数组,每个元素都包含一个类似于{img_names_will_change.jpg}some unknown text 的字符串。

我需要一个子例程,从每个元素中去除{yadayada.jpg},并将yadayada.jpg 部分添加到第二个数组中。

但是,我仍然需要原始数组中的每个元素才能生存,但没有 {....}

我研究过使用 substr 或 regex,但在语法上迷路了。

我也将成为正则表达式的 RTFM。

【问题讨论】:

  • 以下解决方案适用于所有人,但不会从原始数组的每个元素中删除“{img.jpg}”子字符串。无论如何也要做到这一点?

标签: regex arrays perl substring substr


【解决方案1】:

如果我猜对了,这可能是一个解决方案:

my @names = (
  '{img_names_will_change.jpg}some unknown text',
  '{img_names_will_change.jpg}some unknown text',
  '{img_names_will_change.jpg}some unknown text'
);
my @extract;
foreach my $name ( @names ) {
  if ( $name =~ m/{(\w+\.\w+)}/ ) {
    push @extract, $1;
  }
}

use Data::Dumper;
print Dumper @extract;

输出

$VAR1 = 'img_names_will_change.jpg';
$VAR2 = 'img_names_will_change.jpg';
$VAR3 = 'img_names_will_change.jpg';

使用{(\w+\.\w+)} 提取图像名称并将其推送到另一个数组中。

【讨论】:

  • 看起来它可能有效,但你为什么不直接执行 "foreach (@names){ if ($name =~ ....." 为什么要创建一个 $name 变量?另外,这会从@names 数组元素中去除“{...}”吗?顺便说一句,很棒的工作。我们可以给人们积分以表示感谢吗???
  • 我的意思是“如果 ($_ =~ ...”
  • 左侧有一个箭头表示赞成/反对票,如果您是 OP,则“接受此答案”。回到你的答案:它建议在循环名称中给出变量。例如,如果您有两个循环。你不能肯定地说,使用了哪个$_。它也更具可读性。
  • 完美地复制 img.jpg 的东西,但不会从原始元素中删除 {img.jpg}。有什么建议吗?
  • 如果要删除它,请使用替换 s///。所以它类似于if ( $name =~ s/{(\w+\.\w+)}//r ) {
【解决方案2】:

我明白了。只需将字符串的其余部分添加到$2 并将其应用于$original。谢谢 Paulchenkiller!

foreach my $orignal ( @original ) {

#Extracts the text from within "{}" and pushes it into @images       
if ( $original =~ m/{(\w+\.\w+)}(.*)/ ) {

push @images, $1;

#Strips "{..}" out of @original
$original = $2;

}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2020-01-18
    • 2011-05-11
    • 2011-02-17
    • 1970-01-01
    相关资源
    最近更新 更多