【问题标题】:remove a space from a perl variable从 perl 变量中删除一个空格
【发布时间】:2013-06-24 04:39:30
【问题描述】:

我在进行简单的搜索和替换时遇到了很多麻烦。我尝试了提供的解决方案 How do I remove white space in a Perl string? 但无法打印。

这是我的示例代码:

#!/usr/bin/perl
use strict;
my $hello = "hello world";
print "$hello\n"; #this should print out >> hello world
#now i am trying to print out helloworld (space removed)
my $hello_nospaces = $hello =~ s/\s//g;
#my $hello_nospaces = $hello =~ s/hello world/helloworld/g;
#my $hello_nospaces = $hello =~ s/\s+//g;
print "$hello_nospaces\n"
#am getting a blank response when i run this.

我尝试了几种不同的方法,但都无法做到。

我的最终结果是在 linux 环境中自动移动文件的某些方面,但有时文件名称中有空格,所以我想从变量中删除空格。

【问题讨论】:

  • 另外,Linux 和许多其他操作系统完全支持文件名中的空格,只要开发人员小心。删除空格可能会产生不利影响,例如在文件“helloworld.txt”和“hello world.txt”之间产生歧义。
  • 感谢大家的快速回复。我一直在尝试改变 s 和 g 之间的语法。抱歉,我不能投票,我没有 15 个代表点

标签: string perl variables whitespace


【解决方案1】:

你快到了;您只是对运算符优先级感到困惑。您要使用的代码是:

(my $hello_nospaces = $hello) =~ s/\s//g;

首先,这会将变量$hello 的值分配给变量$hello_nospaces。然后它对$hello_nospaces执行替换操作,就像你说的那样

my $hello_nospaces = $hello;
$hello_nospaces =~ s/\s//g;

因为绑定运算符=~的优先级高于赋值运算符=,所以你写的方式

my $hello_nospaces = $hello =~ s/\s//g;

首先对$hello 执行替换,然后将替换操作的结果(在本例中为1)赋给变量$hello_nospaces

【讨论】:

  • 非常感谢。我认为这只是一个语法错误。你的解释很清楚,现在我明白了。谢谢
  • 很明显,该操作没有优先级问题——相反,该操作存在就地替换问题,即操作认为 s// 返回了一个新字符串。
【解决方案2】:

截至5.14,Perl 提供了non-destructive s/// option

无损替换

替换 (s///) 和音译 (y///) 运算符现在支持复制输入变量、对副本执行替换并返回结果的 /r 选项。原件保持不变。

my $old = "cat";
my $new = $old =~ s/cat/dog/r;
# $old is "cat" and $new is "dog"

这对于map 特别有用。有关更多示例,请参阅perlop

所以:

my $hello_nospaces = $hello =~ s/\s//gr;

应该做你想做的。

【讨论】:

    【解决方案3】:

    您只需要添加括号,以便 Perl 的解析器可以理解您想要它做什么。

    my $hello = "hello world";
    print "$hello\n";
    

    (my $hello_nospaces = $hello) =~ s/\s//g;
    print "$hello_nospaces\n";
    
    ## prints 
    ## hello world
    ## helloworld
    

    【讨论】:

      【解决方案4】:

      分割这一行:

      my $hello_nospaces = $hello =~ s/\s//g;
      

      进入这两个:

      my $hello_nospaces = $hello;
      $hello_nospaces =~ s/\s//g;
      

      来自官方Perl Regex Tutorial

      如果有匹配,s///返回替换的次数;否则返回 false。

      【讨论】:

      • (my $hello_nospaces = $hello) =~ s/\s//g;。不知道为什么我更喜欢这个,但它有点短。
      猜你喜欢
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 2013-10-02
      • 1970-01-01
      相关资源
      最近更新 更多