-1

このような入力ファイルがあります

1a0i b.40.4.6
1a49 b.58.1.1
1a82 c.37.1.10
1atp d.144.1.7
。
。
。
。

問題1

各行を@Arrayに入れます

私が使うとき

$Line = chomp($Array[0]);
print $Line;

画面1に出力を表示します

but When I use
$Line = $Array[0];
print $Line;

画面1a0ib.40.4.6に出力を表示します

なぜchompは$Lineを1文字だけ残すのですか?


問題2

b.40をfile_nameとして使用したいので、これが私のコードです

$Array[0]は1a0ib.40.4.6です

$Line = $Array[0];
@Element = split(" ",$Line);
@Tiny_element = split(".",$Element[1]);
$File_name = join(".",splice(@Tiny_element,0,2));

$ File_nameを出力しますが、何も表示されません。使用Dumper \@Tiny_elementしますが、空のIを表示print $Element[1]します。b.40.4.6を表示します。show1を使用index($Element[1],".")するので、「。」が含まれていることがわかります。ただし、「。」で区切ることはできません。

私は試してみsplit("\.",$Element[1])ます; split('.',$Element[1])前に、しかしそれはまだ解決しません...。

どうしたの?

ありがとう

4

3 に答える 3

3

おそらく、関数の動作を推測するだけでなく、使用している関数のドキュメントを読んでみることができます。

chompのドキュメントには次のように書かれています。

すべての引数から削除された文字の総数を返します

文字列はその場で編集されます。

于 2013-03-13T13:46:12.733 に答える
2

問題1への回答:

使用する:

chomp($Array[0]);
$Line = $Array[0];

それ以外の:

$Line = chomp($Array[0]);

これは、の戻り値がchomp文字列ではなく、文字列から削除された末尾の文字の数であるためです。

問題2への回答

$File_name = $1 if ($Line =~ /\s([^\.]+\.[^\.]+)/);
于 2013-03-13T12:20:18.373 に答える
1

2番目の問題について、splitステートメントの1番目のパラメーターを次のように変更してコードを明確にした場合:

 $Line = $Array[0];
 @Element = split(/ /,$Line);
 @Tiny_element = split(/./,$Element[1]);
 $File_name = join(".",splice(@Tiny_element,0,2));

正規表現のワイルドカード文字であることを思い出しました.が、エラーをよりよく理解できますか?

ところで:/[.]/文字通りのピリオドを見つけるための素晴らしい正規表現です。

于 2013-03-13T16:05:05.057 に答える