-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;

在屏幕 1a0i b.40.4.6 中显示输出

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


问题2

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

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

它出什么问题了?

谢谢

4

3 回答 3

3

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

chomp的文档是这样说的:

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

该字符串已就地编辑。

于 2013-03-13T13:46:12.733 回答
2

Answer to problem 1:

Use:

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

instead of:

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

That's because return value of chomp is not the string, but the number of trailing characters removed from the string.

Answer to problem 2

$File_name = $1 if ($Line =~ /\s([^\.]+\.[^\.]+)/);
于 2013-03-13T12:20:18.373 回答
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 回答