2011-01-13 3 views
3

Добрый день,Sub письменность и конкатенация

Для работы я вдруг должен знать Perl, и, хотя я пробовал себя в этих искусствах лет назад, я, кажется, полностью утрачена. Для программиста Haskell/Java все эти неструктурированные типизации могут нервничать.

Однако я написал этот sub, который должен взять массив однострочных строк и объединить их в одну, многострочную строку. У меня было так:

sub unlines { 
    my (@lines) = @_; 
    my $str = ""; 
    foreach $line (@lines) { 
     $str = join $str, chomp($line), "\n"; 
    } 
    return $str; 
} 

А потом я хотел проверить это, конечно:

print unlines(("GET/http1.1", "Host: localhost", "")); 

И результат вещь

000 

И много новых строк , Я понятия не имею, почему это так. Кто-нибудь может мне помочь и объяснить, возможно, как все эти аргументы, передаваемые субтитрам в Perl, работают? Кажется, очень интересно работать с такими вещами, как @_ и shift, но набрав ... это кошмар.

Благодарим за прослушивание.

+1

Можно ли менять работу? Я продолжаю страдать от корректности состязания и других сложностей жесткости типа P-I-T-A с тех пор, как вам пришлось много работать на C++ после p [удержания исключительно Perl. – DVK

+0

Я только что открыл 'ref' для получения типа, но ... о, джед, это будет ужасно. Я бы предпочел C++ в любой день. Heck, even C. – Lanbo

ответ

7

Ваша проблема заключается в том, как работает chomp; он не возвращает измененную переменную, она возвращает количество удаленных символов и изменяет переменную на месте.

Так грызть первым и присоединиться позже, как это ...

C:\temp>cat test.pl 
my @lines = ('abc','def'); 
chomp @lines; 
print join "\n",@lines; 

C:\temp>test.pl 
abc 
def 
C:\temp> 

И для полноты картины, вот как ваши unlines() может выглядеть

sub unlines { 
    my @lines = @_; 
    chomp @lines;  
    return join "\n", @lines; 
} 
+0

Будет ли 'chomp @ _' влиять на переменную аргументов из области sub? – Lanbo

+0

@ Scán - да, это было бы. Я изменил подпрограмму unlines() в своем ответе, чтобы ввести новую переменную, поэтому суб будет работать со строковыми литералами (которые в противном случае не могли бы быть перепутаны в sub) –

+0

Спасибо большое! Ты помог мне это понять. – Lanbo

Смежные вопросы