为什么chomp($ Array [0])会删除$ Array [0]中的某些字符串?

时间:2013-03-13 12:17:45

标签: perl

我有一个看起来像这样的输入文件

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;

显示屏幕1a0i b.40.4.6

中的输出

为什么chomp会让$ Line只剩下一个字符?


Problem2

我想使用b.40作为file_name,所以这里是我的代码

$ Array [0]是1a0i b.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,但它显示为空 我print $Element[1],它显示b.40.4.6,我使用index($Element[1],".")它显示1,所以我知道它包含“。”但它不能与“。”分开。

我尝试split("\.",$Element[1]); split('.',$Element[1])之前,但它仍然没有解决....

它出了什么问题?

感谢

3 个答案:

答案 0 :(得分:3)

也许您可以尝试阅读您正在使用的函数的文档,而不仅仅是猜测它的行为。

documentation for chomp说:

  

它返回从其所有参数中删除的字符总数

编辑字符串。

答案 1 :(得分:2)

回答问题1:

使用:

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

而不是:

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

那是因为chomp的返回值不是字符串,而是从字符串中删除的尾随字符的数量。

回答问题2

$File_name = $1 if ($Line =~ /\s([^\.]+\.[^\.]+)/);

答案 2 :(得分:1)

对于您的第二个问题,如果我要通过更改split语句的第一个参数来澄清您的代码,如下所示:

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

并提醒您.是正则表达式中的通配符,您能更好地理解错误吗?

BTW:/[.]/是查找文字句点的绝佳正则表达式。