2012-08-02 31 views
6

Czy istnieje inny sposób łączenia zmiennych w perlu? I przypadkowo napisał następujący wiersz kodu:Jak połączyć zmienne w Perlu?

print "$linenumber is: \n" . $linenumber; 

I to spowodowało wyjście jak:

22 is: 
22 

Spodziewałem:

$linenumber is: 
22 

Więc zastanawiałem. Musi interpretować $linenumber w podwójnych cudzysłowach jako odniesienie do zmiennej. (jak fajnie!)

Zastanawiam się: Co jest zastrzeżeniem do stosowania tej metody i czy ktoś może wyjaśnić, jak to działa?

+0

Technicznie nie trzeba złączyć zmienne, jak 'print' może trwać dłużej niż jeden argument. 'print '$ linenumber to: \ n', $ linenumber;' działa również. (Chociaż musisz znać wbudowaną zmienną '$,' (patrz 'man perlvar'). – chepner

+1

' '$ linenumber to: \ n'' nie zrobi tego, co chcesz :-) –

Odpowiedz

12

Interpolacja zmienna występuje podczas używania podwójnych cudzysłowów. Tak więc znaki specjalne muszą zostać usunięte. W tym przypadku, trzeba uciec $:

print "\$linenumber is: \n" . $linenumber; 

To może być zapisane jako:

print "\$linenumber is: \n$linenumber"; 

Aby uniknąć interpolacji ciąg używać apostrofów:

print '$linenumber is: ' . "\n$linenumber"; # No need to escape `$` 
+0

Och! Nie zauważyłem tego. Zaktualizowałem to. Dziękuję Ci. –

+0

Gdy interpolacja zmiennych i granica nazw zmiennych nie jest jasna (np. 'Mój $ page = 12; print" $ pagep. "'), Musisz umieścić nazwę zmiennej w nawiasach klamrowych '$ {...}. 'print" $ {page} p. "' – Aurimas

1

Formułując tę ​​odpowiedź, znalazłem this webpage która wyjaśnia następujące informacje:

################################################### 
#Note that when you have double quoted strings, you don't always need to concatenate. Observe this sample: 

#!/usr/bin/perl 

$a='Big '; 
$b='Macs'; 
print 'I like to eat ' . $a . $b; 

#This prints out: 
# I like to eat Big Macs 

################################################### 

#If we had used double quotes, we could have accomplished the same thing like this: 

#!/usr/bin/perl 

$a='Big '; 
$b='Macs'; 
print "I like to eat $a $b"; 

#Printing this: 
# I like to eat Big Macs 
#without having to use the concatenating operator (.). 

################################################### 

#Remember that single quotes do not interpret, so had you tried that method with single quotes, like this: 


#!/usr/bin/perl 

$a='Big '; 
$b='Macs'; 
print 'I like to eat $a $b'; 
#Your result would have been: 
# I like to eat $a $b 
#Which don't taste anywhere near as good. 

myślałem, że to byłoby pomocne dla społeczności tak pytam to i odpowiadając na moje własne pytanie. Inne pomocne odpowiedzi są mile widziane!

1

możesz ukrócić ukośnik $, aby wydrukować go dosłownie.

print "\$linenumber is: \n" . $linenumber; 

który drukuje to, czego się spodziewałeś. Możesz także użyć pojedynczych cudzysłowów, jeśli nie chcesz, aby perl interpolował nazwy zmiennych, ale wtedy "\n" będzie interpolowane dosłownie.

+0

To to dobry punkt. Coś, o czym zapomniałem wspomnieć. Myślałem, że to nie jest dokładnie moje pytanie. +1 i tak. – kentcdodds

+1

Problem z użyciem pojedynczych cudzysłowów (zgodnie z sugestią) polega na tym, że interpretuje on nową linię dosłownie, zobacz moją edycję. –

3

w Perl dowolnym Łańcuch zbudowany z podwójnych cudzysłowów zostanie interpolowany, więc każda zmienna zostanie zastąpiona przez jego wartość. Podobnie jak wiele innych języków, jeśli chcesz wydrukować plik $, musisz go uciec.

print "\$linenumber is:\n$linenumber"; 

LUB

print "\$linenumber is:\n" . $linenumber; 

LUB

printf "\$linenumber is:\n%s", $linenumber; 

Scalar Interpolation

2

Jeśli zmienisz kod z

print "$linenumber is: \n" . $linenumber; 

do

print '$linenumber is:' . "\n" . $linenumber; 

lub

print '$linenumber is:' . "\n$linenumber"; 

zostanie wydrukowana

$linenumber is: 
22 

Co znajdę przydatna, gdy chcemy wydrukować nazwę zmiennej jest użycie apostrofów tak, że zmienne w woli nie przekłada się na ich wartość, dzięki czemu kod jest łatwiejszy do odczytania.

4

Lubię = metoda operator.

#!/usr/bin/perl 
use strict; 
use warnings; 

my $text .= "... contents ..."; # Append contents to the end of variable $text. 
$text .= $text; # Append variable $text contents to variable $text contents. 
print $text; # Prints "... contents ...... contents ..."