2013-08-19 1 views
0

내 프로그램에 데비안의 버전과 서브 버전을 설치하는 다음 코드가 있습니다. 셸의 출력은 변수에 의해 읽히고 구문 분석되고 문자열이 형성됩니다.끝에 특수 문자를 어떻게 제거합니까?

#!/usr/bin/perl 
use warnings; 
use strict; 
use Scalar::Util qw(looks_like_number); 
chomp(my $distver=`cat /etc/issue`); 
$distver =~ s/\\n//g; 
$distver =~ s/\\/./g; 
$distver =~ s/ //g; 
our $enpos=-1; 
for (my $i=0; $i <length($distver); $i++) { 
    if (looks_like_number(substr($distver, $i, 1))) { 
     if ($enpos == -1) { $enpos = $i; } 
    } 
} 
print "Distro:".substr($distver, 0, $enpos)."".substr($distver, $enpos); 
my $subver=substr($distver, $enpos); 
$subver =~ s/\\n//g; 
$subver =~ s/\\r//g; 
$subver =~ s/\\f//g; 
print "Subversion:".$subver."\n"; 

위의 출력은 : 출력

[email protected]:~# ./distr.pl 
Distro:DebianGNU/Linux7.l 
Subversion:7.l 

마지막에 추가 개행 7.1 이후가있다. 위의 regexes를 시도해 보았습니다. 줄 바꿈을 제거하고 끝에서 피드 문자를 반환하지만 실패했습니다.

의 출력은 this입니다.

나는 처음 출력에서 ​​줄 바꿈을 제거 씹는을 시도하고, 대신 끝나는 줄 바꿈을 제거, 그것은이 한 것을 발견 :

print "Distro:".substr($distver, 0, $enpos)."".substr($distver, $enpos); 
my $subver=chomp(substr($distver, $enpos)); 
print "Subversion:".$subver."\n"; 

출력 :

[email protected]:~# ./distr.pl 
Distro:DebianGNU/Linux7.l 
Subversion:1 
[email protected]:~# 

가 왜 이런 일입니다 ? 왜 chomp (및 chop)는 개행 문자 이상을 잘라 내지까요? 왜이 여분의 개행 문자가 출력됩니까?

답변

3

chomp은 문자열을 제자리에 변경하지만 변경된 문자열은 반환하지 않지만 제거 된 문자 수는 반환합니다.

줄 바꿈을 제거하려면 s/\n//g을 사용하십시오. 이중 백 슬래시는 백 슬래시와 일치합니다.

+0

정규식이 작동하지 않는 이유를 말해 줄 수 있습니까? – Droidzone

+0

/etc/issue의 내용을 게시 할 수 있습니까? – choroba

+0

http://pastebin.com/T3HP6hD8 – Droidzone

0

같이 그것을 시도 :

$ distver = ~ S/N \ * // s의;.