我有一个看起来像这样的输入文件
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])
之前,但它仍然没有解决....
它出了什么问题?
感谢
答案 0 :(得分:3)
答案 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:/[.]/
是查找文字句点的绝佳正则表达式。