0

私のプログラムには、インストールされている Debian のバージョンとサブバージョンを返すことを目的とした次のコードがあります。シェルからの出力は、変数によって読み取られて解析され、文字列が形成されます。

#!/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";

上記の出力は次のとおりです。

root@der:~# ./distr.pl
Distro:DebianGNU/Linux7.l
Subversion:7.l

出力では、7.1 以降、最後に追加の改行があります。最後に改行文字、改行文字、およびフォーム フィード文字を削除するために上記の正規表現を試しましたが、失敗しました。

の出力cat /etc/issueこれです。

最初に chomp を試して出力から改行を削除したところ、末尾の改行を削除する代わりに、次のようになっていることがわかりました。

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

出力:

root@der:~# ./distr.pl
Distro:DebianGNU/Linux7.l
Subversion:1
root@der:~#

では、なぜこれが起こっているのですか?chomp(およびchomp)が改行以上を切り捨てるのはなぜですか? そして、なぜこの余分な改行が出力されるのですか?

4

2 に答える 2

3

chomp文字列をその場で変更すると、変更された文字列ではなく、削除された文字数が返されます。

改行を削除するには、 を使用s/\n//gします。二重のバックスラッシュはバックスラッシュと一致します。

于 2013-08-19T10:36:33.317 に答える
0

次のようにしてみてください。

$distver =~ s/\n.*//s;

于 2013-08-19T11:05:54.493 に答える