Regex Perl正则表达式问题!

Regex Perl正则表达式问题!,regex,linux,perl,string,Regex,Linux,Perl,String,我正在从文件中读取字符串: 2343,0,1,0。。。500次…3次 上面是从文件中读取时的$\uu示例。它是任意数字,后跟500个逗号分隔的0/1,然后是数字3 while(<FILE>){ my $string = $_; chomp($string); my $a = chop($string); my $found; if($string=~m/^[0-9]*\,((0,|1,){$i})/){ $fo

我正在从文件中读取字符串:

2343,0,1,0。。。500次…3次

上面是从文件中读取时的
$\uu
示例。它是任意数字,后跟500个逗号分隔的0/1,然后是数字3

while(<FILE>){
    my $string = $_;
    chomp($string);
    my $a = chop($string);
    my $found;
    if($string=~m/^[0-9]*\,((0,|1,){$i})/){         
        $found = $&.$a;
        print OTH $found,"\n";
        }   
}
while(){
my$string=$\;
咀嚼($string);
我的$a=印章($string);
我的美元找到了;
如果($string=~m/^[0-9]*\,((0,| 1,){$i})/){
$found=$&.$a;
打印找到的其他$,“\n”;
}   
}
我正在使用
chop
从字符串末尾获取数字3。然后匹配第一个数字,后跟出现0或1的
$i
。我遇到的问题是,由于某种原因,
chop
无法处理字符串。在
if
语句中,当我尝试查找匹配项时,返回的是
$&
的内容

我还尝试使用
my$a=substr$a,-1,1以获取数字3,但这也不起作用


奇怪的是,这段代码在Windows上的Eclipse中工作,当我把它放到Linux服务器上时,它就不工作了。有人能发现我犯的愚蠢错误吗?

注意行尾字符…我不能在这里测试,但我想你只是切掉了一个新行。试着先修剪你的绳子,然后再把它砍断。例如,请参见

处理行尾字符…我无法在此处进行测试,但我假设您只需切掉一个换行符。试着先修剪你的绳子,然后再把它砍断。例如,请参见,与其尝试这样做,为什么不使用regexp一次性提取所需的所有内容

my $x = "4123,0,1,0,1,4";
$x =~ /^[0-9]+,((?:0,|1,){4})([0-9]+)/;
print "$1\n$2\n";
产生:

0,1,0,1,
4
这正是你想要的。两组需要的答案都在匹配变量中


请注意,我在0,1前面包含了?:匹配,这样它就不会出现在输出匹配变量中。

与其这样做,为什么不使用regexp一次性提取所有需要的内容呢

my $x = "4123,0,1,0,1,4";
$x =~ /^[0-9]+,((?:0,|1,){4})([0-9]+)/;
print "$1\n$2\n";
产生:

0,1,0,1,
4
这正是你想要的。两组需要的答案都在匹配变量中


请注意,我在0,1前面包含了?:匹配,这样它就不会出现在输出匹配变量中。

作为一项规则,我总是倾向于在数据中使用看不见的空白。我发现它使我的代码更加健壮,希望有人在一行或字符串的末尾看不到额外的空格(如在写入日志时)。所以我认为这会解决你的问题:

my ( $a ) = $string =~ /(\S)\s*$/;
当然,既然你知道你在寻找一个数字,那么最好更精确一些:

my ( $a ) = $string =~ /(\d+)\s*$/;

作为一项规则,我总是倾向于允许数据中出现看不见的空白。我发现它使我的代码更加健壮,希望有人在一行或字符串的末尾看不到额外的空格(如在写入日志时)。所以我认为这会解决你的问题:

my ( $a ) = $string =~ /(\S)\s*$/;
当然,既然你知道你在寻找一个数字,那么最好更精确一些:

my ( $a ) = $string =~ /(\d+)\s*$/;

我真的不确定您在这里想要实现什么,但我已经在Win32和Solaris上尝试了这些代码,并且效果很好。你确定$i是正确的号码吗?可能更容易使用*或者

use strict;
use warnings;

while(<DATA>){
    my $string = $_;
    chomp($string);
    my $a = chop($string);
    print "$string\n";
    my $found;
    if($string=~m/^[0-9]*\,((0,|1,)*)/){         
        $found = $&.$a;
        print $found,"\n";
        }   
}



__DATA__
2343,0,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,3
使用严格;
使用警告;
while(){
my$string=$\;
咀嚼($string);
我的$a=印章($string);
打印“$string\n”;
我的美元找到了;
如果($string=~m/^[0-9]*\,((0,| 1,)*)/){
$found=$&.$a;
打印找到的$,“\n”;
}   
}
__资料__
2343,0,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,3

我真的不确定您想在这里实现什么,但我已经在Win32和Solaris上尝试了该代码,并且效果良好。你确定$i是正确的号码吗?可能更容易使用*或者

use strict;
use warnings;

while(<DATA>){
    my $string = $_;
    chomp($string);
    my $a = chop($string);
    print "$string\n";
    my $found;
    if($string=~m/^[0-9]*\,((0,|1,)*)/){         
        $found = $&.$a;
        print $found,"\n";
        }   
}



__DATA__
2343,0,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,3
使用严格;
使用警告;
while(){
my$string=$\;
咀嚼($string);
我的$a=印章($string);
打印“$string\n”;
我的美元找到了;
如果($string=~m/^[0-9]*\,((0,| 1,)*)/){
$found=$&.$a;
打印找到的$,“\n”;
}   
}
__资料__
2343,0,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,3

在这种情况下,我看不出有多少理由使用正则表达式,只需使用

使用严格;
使用警告;
使用autodie;#open现在将在失败时死亡
我的%数据;
{
#限制$fh的范围

打开我的$fh,“在这种情况下,我看不出有多少理由使用正则表达式,只需使用

使用严格;
使用警告;
使用autodie;#open现在将在失败时关闭
我的%数据;
{
#限制$fh的范围

打开我的$fh,'chomp()应该会吃掉所有尾随的空格。是的,如果正在读取的数据在一行末尾有“\r\n”,则会发生这种情况。请尝试
Text::Trim::rtrim($string),而不是
chomp
try
Text::Trim::rtrim($string)
$string=~s/\s+$/
@Wes Hardaker-chomp只删除与
$/
值匹配的内容,chomp()应该吃掉所有尾随空格。是的,如果正在读取的数据在一行末尾有“\r\n”,则会发生这种情况。请尝试
而不是
chomp
尝试
Text::Trim::rtrim($string)
$string=~s/\s+$/
@Wes Hardaker-chomp仅删除与
$/
变量$a和$b的值匹配的内容。变量$a和$b是Perl在排序例程中使用的特殊变量;作为一项规则,它们不应在此之外使用。不要使用,这不是用于此目的的。不要使用。在程序中的任何位置使用此变量都会导致错误“所有正则表达式匹配都会造成相当大的性能损失。@Brad Gilbert,感谢您提供的信息,我对perl非常陌生。这是我的第一个项目。虽然我不明白为什么上面的内容不能有效地使用chop。它返回字符串的最后一个字符,这正是我想要的。也许无效是错误的单词,也许我应该说st。”非常不鼓励。变量$a和$b是Perl在排序例程中使用的特殊变量;作为一项规则,它们不应在此之外使用。不要使用,这并不意味着要这样做。不要使用。在程序中的任何地方使用此变量都会对所有正则表达式造成相当大的性能损失