Имам входен файл, който изглежда така
1a0i b.40.4.6 1a49 b.58.1.1 1a82 c.37.1.10 1atp d.144.1.7 , , , ,
Problem1
Слагам всеки ред в @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 като име на файл, така че тук това е моят код
$ 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])
преди, но все още не решавам ....
Какво не е наред с това?
Благодаря
Отговори:
2 за отговор № 1Отговор на проблем 1:
Употреба:
chomp($Array[0]);
$Line = $Array[0];
вместо:
$Line = chomp($Array[0]);
Това е, защото възвръщаемата стойност на chomp
не е низът, а броят на последните символи, премахнати от низ.
Отговор на проблем 2
$File_name = $1 if ($Line =~ /s([^.]+.[^.]+)/);
3 за отговор № 2
Може би бихте могли да опитате да прочетете документацията за функция, която използвате, а не просто да гадаете за нейното поведение.
Най- документация за chomp казва следното:
Той връща общия брой знаци, отстранени от всичките му аргументи
Низът е редактиран на място.
1 за отговор № 3
За втория ви проблем, ако бих искал да изясня кода ви, като променя първия параметър на разделените извлечения, както следва:
$Line = $Array[0];
@Element = split(/ /,$Line);
@Tiny_element = split(/./,$Element[1]);
$File_name = join(".",splice(@Tiny_element,0,2));
и ви напомня това .
е символ на заместващи символи в регулярни изрази, по-добре ли ще разберете грешката си?
BTW: /[.]/
е чудесен регекс за намиране на буквални периоди.