2011-05-06 113 views
1

我在那里我被拆分的空格约束条件的方法。我想删除减号当它是单独喜欢这些:Perl的 - 连字符和减号

$word =~ s/^\-$//; 

的问题是,我不能在视觉上识别减去和连字符(用于例如分离两个单词)之间的差。我如何确定我只是删除了减号?

+1

好吧,假设你是不是试图解析代码,减去应始终没有字符它除了空格前,而连字符应该有'\ S \ S *'之前。如果您发布了一些示例数据,我们可能会给您一个更好的答案。 – 2011-05-06 18:28:23

+0

我认为OP是指他的源代码,而不是他的数据。 @Andrew,你能澄清一下在你的Perl源代码中(在这种情况下,我的答案是否适用),或者在你的数据中(在这种情况下,我误解了你的问题),你是否有麻烦在视觉上识别减号和连字符。 – Lumi 2011-05-06 21:09:21

回答

3

在可打印的ASCII字符集,连字符和减号是相同的符号(ASCII 45),所以当你刚刚扫描打印的ASCII文本数据,无论你删除与否真的取决于上下文。此外,带连字符的单词不应该包含空格,并且当用于分隔短语时 - 就像这样 - 通常会找到两个连续的短划线。所以,如果你自己发现了这个符号,那么文件中会出现一些不寻常的现象。

要匹配恩连字符或破折号字符,你会搜索\ 226或(八进制的ASCII值)分别\ 227。

+0

ASCII只能上到'\ 177'。 U + 2013是EN DASH,U + 2014是EM DASH,U + 2010是HYPHEN,U + 2011是非破坏性的HYPHEN,U + 2212是MINUS SIGN。 – tchrist 2011-05-07 13:09:46

+0

所以会是正确的说“要匹配恩连字符或破折号字符,你会搜索\ 226或\ 227分别(八进制的UTF-8值)”我只是想,如果你知道你正在搜索的文件是UTF-8,呃? (我现在正处于我的头上,顺便说一下;-) – kshep 2011-05-07 17:30:29

+0

不,\ 226是十进制150,即U + 0096保护区开始。 \ 227是十进制的151,即U + 0097保护区域结束。你必须考虑一些传统的编码系统,而不是标准的Unicode或ISO 8859-1。 – tchrist 2011-05-07 18:11:14

-4

编码时,用一个合适的编辑器。其中有很多,使用谷歌或询问开发人员。这里有一个选择记事本中:

这些编辑们不会卖给你一个连字符为负,当你清楚地按下键盘上的减号键。所以在大约十一年的编程中,我从来没有遇到过这个问题,因为使用了合适的编辑软件进行编码。

2

尝试:

#!/usr/bin/env perl 

use strict; 
use warnings; 

while(<DATA>){ 

    if(m/(?<=[[:alpha:]])\-(?=[[:alpha:]])/){ 
    print "hyphen: $_"; 
    }elsif(m/\-/){ 
    print "minus: $_"; 
    }else{ 
    print "other: $_"; 
    } 

} 

__DATA__ 
this has hypenated-words. 
this is a negative number: -2 
some confusing-2 things 
-to test it 
title -- one-line description 
相关问题