Home » Perl Array

Summary : in this tutorial, you’ll learn about Perl array and how to use arrays effectively in your program.

Introduction to Perl array

Perl Array

A list is immutable so you cannot change it directly. In order to change a list, you need to store it in an array  variable .

By definition, an array is a variable that provides dynamic storage for a list.

In Perl, the terms array and list are used interchangeably, but you have to note an important difference: a list is immutable whereas an array is mutable. In other words, you can modify the array’s elements, grow or shrink the array, but not a list.

A scalar variable begins with the dollar sign ( $ ), however, an array variable begins with an at-sign ( @ ).

The following example illustrates how to declare an array variable:

The $ sign looks like S in the word s calar. And @ looks like a in the word a rray, which is a simple trick to remember what type of variables you are working with.

Accessing Perl array elements

Like a list, you can access array elements using square brackets []  and indices as shown in the following example:

If you take a look at the code carefully, you will see that we used $days[0] instead of @days[0] .

This is because an array element is a scalar, you have to use the scalar prefix ( $ ). In Perl, the rule is that the prefix represents what you want to get, not what you’ve got.

Perl also allows you to access array elements using negative indices. Perl returns an element referred to by a negative index from the end of the array. For example, $days[-1] returns the last element of the array @days .

You can access multiple array elements at a time using the same technique as the list slice.

Counting Perl array elements

If you treat an array as a scalar, you will get the number of elements in the array. Take a look at the following code:

However, this code causes an error in case you don’t really want to count it but accidentally assign an array to a scalar. To be safe, use the scalar() function as follows:

The operator $#  returns the highest index of an array. See the following example:

Modifying Perl array elements

To change the value of an element, you access the element using the index and assign it a new value. Perl also allows you to change the values of multiple elements at a time.

See the following example:

Perl array operations

Perl provides several useful functions and operators to help you manipulate arrays effectively. We will cover the most important ones in the following sections.

Perl array as a stack with push() and pop() functions

Both functions treat an array as a stack. A stack works based on the last in first out (LIFO) philosophy. It works exactly the same as a stack of books. The push() function appends one or more elements to the end of the array, while the pop() function removes the last element from the end of the array.

The following example demonstrates how to use push() and pop() functions:

Perl array as a queue with unshift() and pop() functions

If the push() and pop() treat an array as a stack, the unshift() and pop() functions treat an array as a queue. A queue works based on the first in first out (FIFO) philosophy. It works like a queue of visitors. The unshift() function adds one or more elements to the front of the array, while the pop() function removes the last element of the array.

The following example demonstrates how to use the unshift() and pop() functions:

Sorting Perl arrays

Perl provides the sort() function that allows you to sort an array in alphabetical or numerical order. Here is an example of sorting an array of strings alphabetically.

The sort() function also accepts a block of code that allows you to change the sort algorithm. If you want to sort an array in numerical order, you need to change the default sorting algorithm.

Let’s take a look at the example below:

In the example above:

  • First, we had an unsorted array @a , and we displayed the @a array to make sure that it is unsorted.
  • Second, we used the sort() function to sort the @a array. We passed a block of code {$a <=>$b} and the @a array to the sort function. The $a  and $b are global variables defined by the sort() function for sorting. The operator <=> is used to compare two numbers. The code block {$a <=> $b} returns -1 if $a < $b , 0 if $a = $b , and 1 if $a > $b .
  • Third, we displayed the elements of the sorted array @a.

For more information on the sort()  function, check out the Perl sort function .

In this tutorial, we’ve introduced you to Perl array and shown you some useful techniques to manipulate array’s elements effectively.

Perl array variables store an ordered list of scalar values. The array variable name begins with the @ symbol. To refer to a single element of an array, the variable name must start with a $ followed by the index of the element in square brackets ( [] ). The index of the first array element is 0.

For example:

Accessing array elements can be done with a negative index. This will select elements from the end of the array.

Perl supports a shortcut for sequential letters or numbers. Use the range operator .. to assign sequential values to array elements. For example:

The size or length of the array can be evaluated by the scalar context of the array or by using the scalar variable value of the last array element. The scalar context is refered to by scalar @array . The last array element is refered to by $#array . If @array is empty, the value of $#array is -1.

Perl offers many useful functions to manipulate arrays and their elements:

  • push(@array, element) : add element or elements into the end of the array
  • $popped = pop(@array) : delete and return the last element of the array
  • $shifted = shift(@array) : delete and return the first element of the array
  • unshift(@array) : add element or elements into the beginning of the array

Slicing an array is selecting more than one element from an array to create another array. The specification of a slice must be a list of comma-delimited valid index numbers, or using the range operator.

You can use the split() function to split a long string into separate array elements, using a value as a delimiter string.

You can use the join() function to rejoin elements of an array into a long scalar string, with an optional delimiter.

Since as an array is a comma-delimited list of values you can easily combine two arrays with the merge() function. For example:

An array holds a list of cellular phone models. A second array holds the price of each model in US Dollars. Create a third array which contains the price of each model in Pounds Sterling. Assume 1 pound equals 2 US Dollars. As the result print one line per model stating its cost in pounds.

For example: "One iPhone X costs 120 pounds."

Sphere Engine

Beginner Perl Maven tutorial

  • Installing and getting started with Perl
  • The Hash-bang line, or how to make a Perl scripts executable on Linux
  • Perl Editor
  • How to get Help for Perl?
  • Perl on the command line
  • Core Perl documentation and CPAN module documentation
  • POD - Plain Old Documentation
  • Debugging Perl scripts
  • Common Warnings and Error messages in Perl
  • Prompt, read from STDIN, read from the keyboard in Perl
  • Automatic string to number conversion or casting in Perl
  • Conditional statements, using if, else, elsif in Perl
  • Boolean values in Perl
  • Numerical operators
  • String operators: concatenation (.), repetition (x)
  • undef, the initial value and the defined function of Perl
  • Strings in Perl: quoted, interpolated and escaped
  • Here documents, or how to create multi-line strings in Perl

Scalar variables

  • Comparing scalars in Perl
  • String functions: length, lc, uc, index, substr
  • Number Guessing game
  • Scope of variables in Perl
  • Short-circuit in boolean expressions
  • How to exit from a Perl script?
  • Standard output, standard error and command line redirection
  • Warning when something goes wrong
  • What does die do?
  • Writing to files with Perl
  • Appending to files
  • Open and read from text files
  • Don't Open Files in the old way
  • Reading and writing binary files in Perl
  • EOF - End of file in Perl
  • tell how far have we read a file
  • seek - move the position in the filehandle in Perl
  • slurp mode - reading a file in one step
  • Perl for loop explained with examples
  • Perl Arrays
  • Processing command line arguments - @ARGV in Perl
  • How to process command line arguments in Perl using Getopt::Long
  • Advanced usage of Getopt::Long for accepting command line arguments
  • Perl split - to cut up a string into pieces
  • How to read a CSV file using Perl?
  • The year of 19100
  • Scalar and List context in Perl, the size of an array
  • Reading from a file in scalar and list context
  • STDIN in scalar and list context
  • Sorting arrays in Perl
  • Sorting mixed strings
  • Unique values in an array in Perl
  • Manipulating Perl arrays: shift, unshift, push, pop
  • Reverse Polish Calculator in Perl using a stack
  • Using a queue in Perl
  • Reverse an array, a string or a number
  • The ternary operator in Perl
  • Loop controls: next, last, continue, break
  • min, max, sum in Perl using List::Util
  • qw - quote word
  • Subroutines and functions in Perl
  • Passing multiple parameters to a function in Perl
  • Variable number of parameters in Perl subroutines
  • Returning multiple values or a list from a subroutine in Perl
  • Understanding recursive subroutines - traversing a directory tree
  • Hashes in Perl
  • Creating a hash from an array in Perl
  • Perl hash in scalar and list context
  • exists - check if a key exists in a hash
  • delete an element from a hash
  • How to sort a hash in Perl?
  • Count the frequency of words in text using Perl
  • Introduction to Regexes in Perl 5
  • Regex character classes
  • Regex: special character classes
  • Perl 5 Regex Quantifiers
  • trim - removing leading and trailing white spaces with Perl
  • Perl 5 Regex Cheat sheet
  • What are -e, -z, -s, -M, -A, -C, -r, -w, -x, -o, -f, -d , -l in Perl?
  • Current working directory in Perl (cwd, pwd)
  • Running external programs from Perl with system
  • qx or backticks - running external command and capturing the output
  • How to remove, copy or rename a file with Perl
  • Reading the content of a directory
  • Traversing the filesystem - using a queue
  • Download and install Perl
  • Installing a Perl Module from CPAN on Windows, Linux and Mac OSX
  • How to change @INC to find Perl modules in non-standard locations
  • How to add a relative directory to @INC
  • How to replace a string in a file with Perl
  • How to read an Excel file in Perl
  • How to create an Excel file with Perl?
  • Sending HTML e-mail using Email::Stuffer
  • Perl/CGI script with Apache2
  • JSON in Perl
  • Simple Database access using Perl DBI and SQL
  • Reading from LDAP in Perl using Net::LDAP
  • Global symbol requires explicit package name
  • Variable declaration in Perl
  • Use of uninitialized value
  • Barewords in Perl
  • Name "main::x" used only once: possible typo at ...
  • Unknown warnings category
  • Can't use string (...) as an HASH ref while "strict refs" in use at ...
  • Symbolic references in Perl
  • Can't locate ... in @INC
  • Scalar found where operator expected
  • "my" variable masks earlier declaration in same scope
  • Can't call method ... on unblessed reference
  • Argument ... isn't numeric in numeric ...
  • Can't locate object method "..." via package "1" (perhaps you forgot to load "1"?)
  • Useless use of hash element in void context
  • Useless use of private variable in void context
  • readline() on closed filehandle in Perl
  • Possible precedence issue with control flow operator
  • Scalar value ... better written as ...
  • substr outside of string at ...
  • Have exceeded the maximum number of attempts (1000) to open temp file/dir
  • Use of implicit split to @_ is deprecated ...
  • Multi dimensional arrays in Perl
  • Multi dimensional hashes in Perl
  • Minimal requirement to build a sane CPAN package
  • Statement modifiers: reversed if statements
  • What is autovivification?
  • Formatted printing in Perl using printf and sprintf
  • FATAL warnings

Fatal warnings

Avoiding the automatic string to number conversion, operator overloading.

Gabor Szabo

Published on 2013-04-20

Author: Gabor Szabo

perl assign array to scalar

  • about the translations

Perl Tutorial

  • Perl Basics
  • Perl - Home
  • Perl - Introduction
  • Perl - Environment
  • Perl - Syntax Overview
  • Perl - Data Types
  • Perl - Variables
  • Perl - Scalars

Perl - Arrays

  • Perl - Hashes
  • Perl - IF...ELSE
  • Perl - Loops
  • Perl - Operators
  • Perl - Date & Time
  • Perl - Subroutines
  • Perl - References
  • Perl - Formats
  • Perl - File I/O
  • Perl - Directories
  • Perl - Error Handling
  • Perl - Special Variables
  • Perl - Coding Standard
  • Perl - Regular Expressions
  • Perl - Sending Email
  • Perl Advanced
  • Perl - Socket Programming
  • Perl - Object Oriented
  • Perl - Database Access
  • Perl - CGI Programming
  • Perl - Packages & Modules
  • Perl - Process Management
  • Perl - Embedded Documentation
  • Perl - Functions References
  • Perl Useful Resources
  • Perl - Questions and Answers
  • Perl - Quick Guide
  • Perl - Useful Resources
  • Perl - Discussion
  • Selected Reading
  • UPSC IAS Exams Notes
  • Developer's Best Practices
  • Questions and Answers
  • Effective Resume Writing
  • HR Interview Questions
  • Computer Glossary

An array is a variable that stores an ordered list of scalar values. Array variables are preceded by an "at" (@) sign. To refer to a single element of an array, you will use the dollar sign ($) with the variable name followed by the index of the element in square brackets.

Here is a simple example of using the array variables −

Here we have used the escape sign (\) before the $ sign just to print it. Other Perl will understand it as a variable and will print its value. When executed, this will produce the following result −

In Perl, List and Array terms are often used as if they're interchangeable. But the list is the data, and the array is the variable.

Array Creation

Array variables are prefixed with the @ sign and are populated using either parentheses or the qw operator. For example −

The second line uses the qw// operator, which returns a list of strings, separating the delimited string by white space. In this example, this leads to a four-element array; the first element is 'this' and last (fourth) is 'array'. This means that you can use different lines as follows −

You can also populate an array by assigning each value individually as follows −

Accessing Array Elements

When accessing individual elements from an array, you must prefix the variable with a dollar sign ($) and then append the element index within the square brackets after the name of the variable. For example −

This will produce the following result −

Array indices start from zero, so to access the first element you need to give 0 as indices. You can also give a negative index, in which case you select the element from the end, rather than the beginning, of the array. This means the following −

Sequential Number Arrays

Perl offers a shortcut for sequential numbers and letters. Rather than typing out each element when counting to 100 for example, we can do something like as follows −

Here double dot (..) is called range operator . This will produce the following result −

The size of an array can be determined using the scalar context on the array - the returned value will be the number of elements in the array −

The value returned will always be the physical size of the array, not the number of valid elements. You can demonstrate this, and the difference between scalar @array and $#array, using this fragment is as follows −

There are only four elements in the array that contains information, but the array is 51 elements long, with a highest index of 50.

Adding and Removing Elements in Array

Perl provides a number of useful functions to add and remove elements in an array. You may have a question what is a function? So far you have used print function to print various values. Similarly there are various other functions or sometime called sub-routines, which can be used for various other functionalities.

Slicing Array Elements

You can also extract a "slice" from an array - that is, you can select more than one item from an array in order to produce another array.

The specification for a slice must have a list of valid indices, either positive or negative, each separated by a comma. For speed, you can also use the .. range operator −

Replacing Array Elements

Now we are going to introduce one more function called splice() , which has the following syntax −

This function will remove the elements of @ARRAY designated by OFFSET and LENGTH, and replaces them with LIST, if specified. Finally, it returns the elements removed from the array. Following is the example −

Here, the actual replacement begins with the 6th number after that five elements are then replaced from 6 to 10 with the numbers 21, 22, 23, 24 and 25.

Transform Strings to Arrays

Let's look into one more function called split() , which has the following syntax −

This function splits a string into an array of strings, and returns it. If LIMIT is specified, splits into at most that number of fields. If PATTERN is omitted, splits on whitespace. Following is the example −

Transform Arrays to Strings

We can use the join() function to rejoin the array elements and form one long scalar string. This function has the following syntax −

This function joins the separate strings of LIST into a single string with fields separated by the value of EXPR, and returns the string. Following is the example −

Sorting Arrays

The sort() function sorts each element of an array according to the ASCII Numeric standards. This function has the following syntax −

This function sorts the LIST and returns the sorted array value. If SUBROUTINE is specified then specified logic inside the SUBTROUTINE is applied while sorting the elements.

Please note that sorting is performed based on ASCII Numeric value of the words. So the best option is to first transform every element of the array into lowercase letters and then perform the sort function.

The $[ Special Variable

So far you have seen simple variable we defined in our programs and used them to store and print scalar and array values. Perl provides numerous special variables, which have their predefined meaning.

We have a special variable, which is written as $[ . This special variable is a scalar containing the first index of all arrays. Because Perl arrays have zero-based indexing, $[ will almost always be 0. But if you set $[ to 1 then all your arrays will use on-based indexing. It is recommended not to use any other indexing other than zero. However, let's take one example to show the usage of $[ variable −

Merging Arrays

Because an array is just a comma-separated sequence of values, you can combine them together as shown below −

The embedded arrays just become a part of the main array as shown below −

Selecting Elements from Lists

The list notation is identical to that for arrays. You can extract an element from an array by appending square brackets to the list and giving one or more indices −

Similarly, we can extract slices, although without the requirement for a leading @ character −

Kickstart Your Career

Get certified by completing the course

  • Backslash Operator
  • Square Brackets
  • Curly Brackets
  • Anonymous Subroutines
  • Constructors
  • Autovivification
  • Typeglob Slots
  • Simple Scalar
  • Arrow Notation
  • Miscellaneous Usage
  • Circular References
  • Symbolic references
  • Not-so-symbolic references
  • Pseudo-hashes: Using an array as a hash
  • Function Templates
  • Postfix Dereference Syntax
  • Postfix Reference Slicing
  • Assigning to References
  • Declaring a Reference to a Variable
  • WARNING: Don't use references as hash keys

perlref - Perl references and nested data structures

This is complete documentation about all aspects of references. For a shorter, tutorial introduction to just the essential features, see perlreftut .


Before release 5 of Perl it was difficult to represent complex data structures, because all references had to be symbolic--and even then it was difficult to refer to a variable instead of a symbol table entry. Perl now not only makes it easier to use symbolic references to variables, but also lets you have "hard" references to any piece of data or code. Any scalar may hold a hard reference. Because arrays and hashes contain scalars, you can now easily build arrays of arrays, arrays of hashes, hashes of arrays, arrays of hashes of functions, and so on.

Hard references are smart--they keep track of reference counts for you, automatically freeing the thing referred to when its reference count goes to zero. (Reference counts for values in self-referential or cyclic data structures may not go to zero without a little help; see "Circular References" for a detailed explanation.) If that thing happens to be an object, the object is destructed. See perlobj for more about objects. (In a sense, everything in Perl is an object, but we usually reserve the word for references to objects that have been officially "blessed" into a class package.)

Symbolic references are names of variables or other objects, just as a symbolic link in a Unix filesystem contains merely the name of a file. The *glob notation is something of a symbolic reference. (Symbolic references are sometimes called "soft references", but please don't call them that; references are confusing enough without useless synonyms.)

In contrast, hard references are more like hard links in a Unix file system: They are used to access an underlying object without concern for what its (other) name is. When the word "reference" is used without an adjective, as in the following paragraph, it is usually talking about a hard reference.

References are easy to use in Perl. There is just one overriding principle: in general, Perl does no implicit referencing or dereferencing. When a scalar is holding a reference, it always behaves as a simple scalar. It doesn't magically start being an array or hash or subroutine; you have to tell it explicitly to do so, by dereferencing it.

# Making References

References can be created in several ways.

# Backslash Operator

By using the backslash operator on a variable, subroutine, or value. (This works much like the & (address-of) operator in C.) This typically creates another reference to a variable, because there's already a reference to the variable in the symbol table. But the symbol table reference might go away, and you'll still have the reference that the backslash returned. Here are some examples:

It isn't possible to create a true reference to an IO handle (filehandle or dirhandle) using the backslash operator. The most you can get is a reference to a typeglob, which is actually a complete symbol table entry. But see the explanation of the *foo{THING} syntax below. However, you can still use type globs and globrefs as though they were IO handles.

# Square Brackets

A reference to an anonymous array can be created using square brackets:

Here we've created a reference to an anonymous array of three elements whose final element is itself a reference to another anonymous array of three elements. (The multidimensional syntax described later can be used to access this. For example, after the above, $arrayref->[2][1] would have the value "b".)

Taking a reference to an enumerated list is not the same as using square brackets--instead it's the same as creating a list of references!

As a special case, \(@foo) returns a list of references to the contents of @foo , not a reference to @foo itself. Likewise for %foo , except that the key references are to copies (since the keys are just strings rather than full-fledged scalars).

# Curly Brackets

A reference to an anonymous hash can be created using curly brackets:

Anonymous hash and array composers like these can be intermixed freely to produce as complicated a structure as you want. The multidimensional syntax described below works for these too. The values above are literals, but variables and expressions would work just as well, because assignment operators in Perl (even within local() or my()) are executable statements, not compile-time declarations.

Because curly brackets (braces) are used for several other things including BLOCKs, you may occasionally have to disambiguate braces at the beginning of a statement by putting a + or a return in front so that Perl realizes the opening brace isn't starting a BLOCK. The economy and mnemonic value of using curlies is deemed worth this occasional extra hassle.

For example, if you wanted a function to make a new hash and return a reference to it, you have these options:

On the other hand, if you want the other meaning, you can do this:

The leading +{ and {; always serve to disambiguate the expression to mean either the HASH reference, or the BLOCK.

# Anonymous Subroutines

A reference to an anonymous subroutine can be created by using sub without a subname:

Note the semicolon. Except for the code inside not being immediately executed, a sub {} is not so much a declaration as it is an operator, like do{} or eval{} . (However, no matter how many times you execute that particular line (unless you're in an eval("...") ), $coderef will still have a reference to the same anonymous subroutine.)

Anonymous subroutines act as closures with respect to my() variables, that is, variables lexically visible within the current scope. Closure is a notion out of the Lisp world that says if you define an anonymous function in a particular lexical context, it pretends to run in that context even when it's called outside the context.

In human terms, it's a funny way of passing arguments to a subroutine when you define it as well as when you call it. It's useful for setting up little bits of code to run later, such as callbacks. You can even do object-oriented stuff with it, though Perl already provides a different mechanism to do that--see perlobj .

You might also think of closure as a way to write a subroutine template without using eval(). Here's a small example of how closures work:

This prints

Note particularly that $x continues to refer to the value passed into newprint() despite "my $x" having gone out of scope by the time the anonymous subroutine runs. That's what a closure is all about.

This applies only to lexical variables, by the way. Dynamic variables continue to work as they have always worked. Closure is not something that most Perl programmers need trouble themselves about to begin with.

# Constructors

References are often returned by special subroutines called constructors. Perl objects are just references to a special type of object that happens to know which package it's associated with. Constructors are just special subroutines that know how to create that association. They do so by starting with an ordinary reference, and it remains an ordinary reference even while it's also being an object. Constructors are often named new() . You can call them indirectly:

But that can produce ambiguous syntax in certain cases, so it's often better to use the direct method invocation approach:

This indirect object syntax is only available when use feature "indirect" is in effect, and that is not the case when use v5.36 (or higher) is requested, it is best to avoid indirect object syntax entirely.

# Autovivification

References of the appropriate type can spring into existence if you dereference them in a context that assumes they exist. Because we haven't talked about dereferencing yet, we can't show you any examples yet.

# Typeglob Slots

A reference can be created by using a special syntax, lovingly known as the *foo{THING} syntax. *foo{THING} returns a reference to the THING slot in *foo (which is the symbol table entry which holds everything known as foo).

Most of these are self-explanatory, but *foo{IO} deserves special attention. It returns the IO handle, used for file handles ( "open" in perlfunc ), sockets ( "socket" in perlfunc and "socketpair" in perlfunc ), and directory handles ( "opendir" in perlfunc ). For compatibility with previous versions of Perl, *foo{FILEHANDLE} is a synonym for *foo{IO} , though it is discouraged, to encourage a consistent use of one name: IO. On perls between v5.8 and v5.22, it will issue a deprecation warning, but this deprecation has since been rescinded.

*foo{THING} returns undef if that particular THING hasn't been used yet, except in the case of scalars. *foo{SCALAR} returns a reference to an anonymous scalar if $foo hasn't been used yet. This might change in a future release.

*foo{NAME} and *foo{PACKAGE} are the exception, in that they return strings, rather than references. These return the package and name of the typeglob itself, rather than one that has been assigned to it. So, after *foo=*Foo::bar , *foo will become "*Foo::bar" when used as a string, but *foo{PACKAGE} and *foo{NAME} will continue to produce "main" and "foo", respectively.

*foo{IO} is an alternative to the *HANDLE mechanism given in "Typeglobs and Filehandles" in perldata for passing filehandles into or out of subroutines, or storing into larger data structures. Its disadvantage is that it won't create a new filehandle for you. Its advantage is that you have less risk of clobbering more than you want to with a typeglob assignment. (It still conflates file and directory handles, though.) However, if you assign the incoming value to a scalar instead of a typeglob as we do in the examples below, there's no risk of that happening.

# Using References

That's it for creating references. By now you're probably dying to know how to use references to get back to your long-lost data. There are several basic methods.

# Simple Scalar

Anywhere you'd put an identifier (or chain of identifiers) as part of a variable or subroutine name, you can replace the identifier with a simple scalar variable containing a reference of the correct type:

It's important to understand that we are specifically not dereferencing $arrayref[0] or $hashref{"KEY"} there. The dereference of the scalar variable happens before it does any key lookups. Anything more complicated than a simple scalar variable must use methods 2 or 3 below. However, a "simple scalar" includes an identifier that itself uses method 1 recursively. Therefore, the following prints "howdy".

Anywhere you'd put an identifier (or chain of identifiers) as part of a variable or subroutine name, you can replace the identifier with a BLOCK returning a reference of the correct type. In other words, the previous examples could be written like this:

Admittedly, it's a little silly to use the curlies in this case, but the BLOCK can contain any arbitrary expression, in particular, subscripted expressions:

Because of being able to omit the curlies for the simple case of $$x , people often make the mistake of viewing the dereferencing symbols as proper operators, and wonder about their precedence. If they were, though, you could use parentheses instead of braces. That's not the case. Consider the difference below; case 0 is a short-hand version of case 1, not case 2:

Case 2 is also deceptive in that you're accessing a variable called %hashref, not dereferencing through $hashref to the hash it's presumably referencing. That would be case 3.

# Arrow Notation

Subroutine calls and lookups of individual array elements arise often enough that it gets cumbersome to use method 2. As a form of syntactic sugar, the examples for method 2 may be written:

The left side of the arrow can be any expression returning a reference, including a previous dereference. Note that $array[$x] is not the same thing as $array->[$x] here:

This is one of the cases we mentioned earlier in which references could spring into existence when in an lvalue context. Before this statement, $array[$x] may have been undefined. If so, it's automatically defined with a hash reference so that we can look up {"foo"} in it. Likewise $array[$x]->{"foo"} will automatically get defined with an array reference so that we can look up [0] in it. This process is called autovivification .

One more thing here. The arrow is optional between brackets subscripts, so you can shrink the above down to

Which, in the degenerate case of using only ordinary arrays, gives you multidimensional arrays just like C's:

Well, okay, not entirely like C's arrays, actually. C doesn't know how to grow its arrays on demand. Perl does.

If a reference happens to be a reference to an object, then there are probably methods to access the things referred to, and you should probably stick to those methods unless you're in the class package that defines the object's methods. In other words, be nice, and don't violate the object's encapsulation without a very good reason. Perl does not enforce encapsulation. We are not totalitarians here. We do expect some basic civility though.

# Miscellaneous Usage

Using a string or number as a reference produces a symbolic reference, as explained above. Using a reference as a number produces an integer representing its storage location in memory. The only useful thing to be done with this is to compare two references numerically to see whether they refer to the same location.

Using a reference as a string produces both its referent's type, including any package blessing as described in perlobj , as well as the numeric address expressed in hex. The ref() operator returns just the type of thing the reference is pointing to, without the address. See "ref" in perlfunc for details and examples of its use.

The bless() operator may be used to associate the object a reference points to with a package functioning as an object class. See perlobj .

A typeglob may be dereferenced the same way a reference can, because the dereference syntax always indicates the type of reference desired. So ${*foo} and ${\$foo} both indicate the same scalar variable.

Here's a trick for interpolating a subroutine call into a string:

The way it works is that when the @{...} is seen in the double-quoted string, it's evaluated as a block. The block creates a reference to an anonymous array containing the results of the call to mysub(1,2,3) . So the whole block returns a reference to an array, which is then dereferenced by @{...} and stuck into the double-quoted string. This chicanery is also useful for arbitrary expressions:

Similarly, an expression that returns a reference to a scalar can be dereferenced via ${...} . Thus, the above expression may be written as:

# Circular References

It is possible to create a "circular reference" in Perl, which can lead to memory leaks. A circular reference occurs when two references contain a reference to each other, like this:

You can also create a circular reference with a single variable:

In this case, the reference count for the variables will never reach 0, and the references will never be garbage-collected. This can lead to memory leaks.

Because objects in Perl are implemented as references, it's possible to have circular references with objects as well. Imagine a TreeNode class where each node references its parent and child nodes. Any node with a parent will be part of a circular reference.

You can break circular references by creating a "weak reference". A weak reference does not increment the reference count for a variable, which means that the object can go out of scope and be destroyed. You can weaken a reference with the weaken function exported by the Scalar::Util module, or available as builtin::weaken directly in Perl version 5.35.7 or later.

Here's how we can make the first example safer:

The reference from $foo to $bar has been weakened. When the $bar variable goes out of scope, it will be garbage-collected. The next time you look at the value of the $foo->{bar} key, it will be undef .

This action at a distance can be confusing, so you should be careful with your use of weaken. You should weaken the reference in the variable that will go out of scope first . That way, the longer-lived variable will contain the expected reference until it goes out of scope.

# Symbolic references

We said that references spring into existence as necessary if they are undefined, but we didn't say what happens if a value used as a reference is already defined, but isn't a hard reference. If you use it as a reference, it'll be treated as a symbolic reference. That is, the value of the scalar is taken to be the name of a variable, rather than a direct link to a (possibly) anonymous value.

People frequently expect it to work like this. So it does.

This is powerful, and slightly dangerous, in that it's possible to intend (with the utmost sincerity) to use a hard reference, and accidentally use a symbolic reference instead. To protect against that, you can say

and then only hard references will be allowed for the rest of the enclosing block. An inner block may countermand that with

Only package variables (globals, even if localized) are visible to symbolic references. Lexical variables (declared with my()) aren't in a symbol table, and thus are invisible to this mechanism. For example:

This will still print 10, not 20. Remember that local() affects package variables, which are all "global" to the package.

# Not-so-symbolic references

Brackets around a symbolic reference can simply serve to isolate an identifier or variable name from the rest of an expression, just as they always have within a string. For example,

has always meant to print "pop on over", even though push is a reserved word. This is generalized to work the same without the enclosing double quotes, so that

will have the same effect. This construct is not considered to be a symbolic reference when you're using strict refs:

Similarly, because of all the subscripting that is done using single words, the same rule applies to any bareword that is used for subscripting a hash. So now, instead of writing

you can write just

and not worry about whether the subscripts are reserved words. In the rare event that you do wish to do something like

you can force interpretation as a reserved word by adding anything that makes it more than a bareword:

The use warnings pragma or the -w switch will warn you if it interprets a reserved word as a string. But it will no longer warn you about using lowercase words, because the string is effectively quoted.

# Pseudo-hashes: Using an array as a hash

Pseudo-hashes have been removed from Perl. The 'fields' pragma remains available.

# Function Templates

As explained above, an anonymous function with access to the lexical variables visible when that function was compiled, creates a closure. It retains access to those variables even though it doesn't get run until later, such as in a signal handler or a Tk callback.

Using a closure as a function template allows us to generate many functions that act similarly. Suppose you wanted functions named after the colors that generated HTML font changes for the various colors:

The red() and green() functions would be similar. To create these, we'll assign a closure to a typeglob of the name of the function we're trying to build.

Now all those different functions appear to exist independently. You can call red(), RED(), blue(), BLUE(), green(), etc. This technique saves on both compile time and memory use, and is less error-prone as well, since syntax checks happen at compile time. It's critical that any variables in the anonymous subroutine be lexicals in order to create a proper closure. That's the reasons for the my on the loop iteration variable.

This is one of the only places where giving a prototype to a closure makes much sense. If you wanted to impose scalar context on the arguments of these functions (probably not a wise idea for this particular example), you could have written it this way instead:

However, since prototype checking happens at compile time, the assignment above happens too late to be of much use. You could address this by putting the whole loop of assignments within a BEGIN block, forcing it to occur during compilation.

Access to lexicals that change over time--like those in the for loop above, basically aliases to elements from the surrounding lexical scopes-- only works with anonymous subs, not with named subroutines. Generally said, named subroutines do not nest properly and should only be declared in the main package scope.

This is because named subroutines are created at compile time so their lexical variables get assigned to the parent lexicals from the first execution of the parent block. If a parent scope is entered a second time, its lexicals are created again, while the nested subs still reference the old ones.

Anonymous subroutines get to capture each time you execute the sub operator, as they are created on the fly. If you are accustomed to using nested subroutines in other programming languages with their own private variables, you'll have to work at it a bit in Perl. The intuitive coding of this type of thing incurs mysterious warnings about "will not stay shared" due to the reasons explained above. For example, this won't work:

A work-around is the following:

Now inner() can only be called from within outer(), because of the temporary assignments of the anonymous subroutine. But when it does, it has normal access to the lexical variable $x from the scope of outer() at the time outer is invoked.

This has the interesting effect of creating a function local to another function, something not normally supported in Perl.

# Postfix Dereference Syntax

Beginning in v5.20.0, a postfix syntax for using references is available. It behaves as described in "Using References" , but instead of a prefixed sigil, a postfixed sigil-and-star is used.

For example:

In Perl 5.20 and 5.22, this syntax must be enabled with use feature 'postderef' . As of Perl 5.24, no feature declarations are required to make it available.

Postfix dereference should work in all circumstances where block (circumfix) dereference worked, and should be entirely equivalent. This syntax allows dereferencing to be written and read entirely left-to-right. The following equivalencies are defined:

Note especially that $cref->&* is not equivalent to $cref->() , and can serve different purposes.

Glob elements can be extracted through the postfix dereferencing feature:

Postfix array and scalar dereferencing can be used in interpolating strings (double quotes or the qq operator), but only if the postderef_qq feature is enabled. Interpolation of postfix array highest index access ( ->$#* ) is also supported when the postderef_qq feature is enabled.

# Postfix Reference Slicing

Value slices of arrays and hashes may also be taken with postfix dereferencing notation, with the following equivalencies:

Postfix key/value pair slicing, added in 5.20.0 and documented in the Key/Value Hash Slices section of perldata , also behaves as expected:

As with postfix array, postfix value slice dereferencing can be used in interpolating strings (double quotes or the qq operator), but only if the postderef_qq feature is enabled.

# Assigning to References

Beginning in v5.22.0, the referencing operator can be assigned to. It performs an aliasing operation, so that the variable name referenced on the left-hand side becomes an alias for the thing referenced on the right-hand side:

This syntax must be enabled with use feature 'refaliasing' . It is experimental, and will warn by default unless no warnings 'experimental::refaliasing' is in effect.

These forms may be assigned to, and cause the right-hand side to be evaluated in scalar context:

Slicing operations and parentheses cause the right-hand side to be evaluated in list context:

Each element on the right-hand side must be a reference to a datum of the right type. Parentheses immediately surrounding an array (and possibly also my / state / our / local ) will make each element of the array an alias to the corresponding scalar referenced on the right-hand side:

Combining that form with local and putting parentheses immediately around a hash are forbidden (because it is not clear what they should do):

Assignment to references and non-references may be combined in lists and conditional ternary expressions, as long as the values on the right-hand side are the right type for each element on the left, though this may make for obfuscated code:

The foreach loop can also take a reference constructor for its loop variable, though the syntax is limited to one of the following, with an optional my , state , or our after the backslash:

No parentheses are permitted. This feature is particularly useful for arrays-of-arrays, or arrays-of-hashes:

CAVEAT: Aliasing does not work correctly with closures. If you try to alias lexical variables from an inner subroutine or eval , the aliasing will only be visible within that inner sub, and will not affect the outer subroutine where the variables are declared. This bizarre behavior is subject to change.

# Declaring a Reference to a Variable

Beginning in v5.26.0, the referencing operator can come after my , state , our , or local . This syntax must be enabled with use feature 'declared_refs' . It is experimental, and will warn by default unless no warnings 'experimental::refaliasing' is in effect.

This feature makes these:

equivalent to:

It is intended mainly for use in assignments to references (see "Assigning to References" , above). It also allows the backslash to be used on just some items in a list of declared variables:

# WARNING: Don't use references as hash keys

You may not (usefully) use a reference as the key to a hash. It will be converted into a string:

If you try to dereference the key, it won't do a hard dereference, and you won't accomplish what you're attempting. You might want to do something more like

And then at least you can use the values(), which will be real refs, instead of the keys(), which won't.

The standard Tie::RefHash module provides a convenient workaround to this.

Besides the obvious documents, source code can be instructive. Some pathological examples of the use of references can be found in the t/op/ref.t regression test in the Perl source directory.

See also perldsc and perllol for how to use references to create complex data structures, and perlootut and perlobj for how to use them to create objects.

Perldoc Browser is maintained by Dan Book ( DBOOK ). Please contact him via the GitHub issue tracker or email regarding any issues with the site itself, search, or rendering of documentation.

The Perl documentation is maintained by the Perl 5 Porters in the development of Perl. Please contact them via the Perl issue tracker , the mailing list , or IRC to report any issues with the contents or format of the documentation.

Perl Tutorials - Herong's Tutorial Examples - v6.01, by Dr. Herong Yang

Perl Tutorials - Herong's Tutorial Examples

∟ Data Types: Values and Variables

∟ Variables - Scalar, Array and Hash

This section describes Perl variable types: Scalar, Array, and Hash. Variable names must be prefixed with special symbols to indicate their types, $, @ and %.

Perl supports 3 types of variables: Scalar, Array, and Hash.

1. Scalar Variable - A variable to hold a scalar value. The name of a scalar variable must be prefixed with the dollar sign, $, and followed by an identifier, $identifier. For example: $price and $url.

2. Array Variable - A variable to hold a list value. The name of an array variable must be prefixed with the at sign, @, and followed by an identifier, @identifier. For example: @orders and @links.

3. Hash Variable - A variable to hold an associative array, which is a special list value - members are grouped as pairs of keys and values. The name of an array variable must be prefixed with the percent sign, %, and followed by an identifier, %identifier. For example: %priceList and %siteRanks.

Like in many other programming languages, a variable name identifier in Perl is a string beginning with a letter or underscore, and containing letters, underscores, and digits.

Variables for different data types are in different name spaces. You could use the same variable identifier for a scalar, an array, and a hash.

Table of Contents

  About This Book

  Perl on Linux Systems

  ActivePerl on Windows Systems

► Data Types: Values and Variables

  Scalar Values and List Values

  Scalar Value Constructors

  Scalar Value Interpretation

  List Value Constructors

► Variables - Scalar, Array and Hash

  Using Scalar Variables

  Using Array Variables

  Using Hash Variables

  "undef" Value and Undefined Variables

  Expressions, Operations and Simple Statements

  User Defined Subroutines

  Perl Built-in Debugger

  Name Spaces and Perl Module Files

  Symbolic (or Soft) References

  Hard References - Addresses of Memory Objects

  Objects (or References) and Classes (or Packages)

  Typeglob and Importing Identifiers from Other Packages

  String Built-in Functions and Performance

  File Handles and Data Input/Output

  Open Files in Binary Mode

  Open Directories and Read File Names

  File System Functions and Operations

  Image and Picture Processing

  Using DBM Database Files

  Using MySQL Database Server

  Socket Communication Over the Internet

  XML::Simple Module - XML Parser and Generator

  XML Communication Model

  SOAP::Lite - SOAP Server-Client Communication Module

  Perl Programs as IIS Server CGI Scripts

  CGI (Common Gateway Interface)

  XML-RPC - Remote Procedure Call with XML and HTTP

  RPC::XML - Perl Implementation of XML-RPC

  Integrating Perl with Apache Web Server

  CGI.pm Module for Building Web Pages

  LWP::UserAgent and Web Site Testing

  Converting Perl Script to Executable Binary

  Managing Perl Engine and Modules on macOS

  Archived Tutorials


  Full Version in PDF/EPUB

Variables - Scalar, Array and Hash - Updated in 2022, by Dr. Herong Yang

  • Trending Now
  • Data Structures
  • Foundational Courses
  • Data Science
  • Practice Problem
  • Machine Learning
  • Web Development
  • Web Browser

perl assign array to scalar

  • Explore Our Geeks Community
  • Perl Programming Language
  • Introduction to Perl
  • Perl Installation and Environment Setup in Windows, Linux, and MacOS
  • Perl | Basic Syntax of a Perl Program
  • Hello World Program in Perl


  • Perl | Data Types
  • Perl | Boolean Values
  • Perl | Operators | Set - 1
  • Perl | Operators | Set - 2
  • Perl | Variables
  • Perl | Modules
  • Packages in Perl

Control Flow

  • Perl | Decision Making (if, if-else, Nested–if, if-elsif ladder, unless, unless-else, unless-elsif)
  • Perl | Loops (for, foreach, while, do...while, until, Nested loops)
  • Perl | given-when Statement
  • Perl | goto statement

Arrays & Lists

  • Perl | Arrays
  • Perl | Array Slices
  • Perl | Arrays (push, pop, shift, unshift)
  • Perl List and its Types
  • Perl | Hash Operations
  • Perl | Multidimensional Hashes

Perl | Scalars

  • Perl | Comparing Scalars
  • Perl | scalar keyword
  • Perl | Quoted, Interpolated and Escaped Strings
  • Perl | String Operators
  • Perl | String functions (length, lc, uc, index, rindex)

OOP Concepts

  • Object Oriented Programming (OOPs) in Perl
  • Perl | Classes in OOP
  • Perl | Objects in OOPs
  • Perl | Methods in OOPs
  • Perl | Constructors and Destructors
  • Perl | Method Overriding in OOPs
  • Perl | Inheritance in OOPs
  • Perl | Polymorphism in OOPs
  • Perl | Encapsulation in OOPs

Regular Expressions

  • Perl | Regular Expressions
  • Perl | Operators in Regular Expression
  • Perl | Regex Character Classes
  • Perl | Quantifiers in Regular Expression

File Handling

  • Perl | File Handling Introduction
  • Perl | Opening and Reading a File
  • Perl | Writing to a File
  • Perl | Useful File-handling functions

CGI Programming

  • Perl | CGI Programming
  • Perl | File Upload in CGI
  • Perl | GET vs POST in CGI

A scalar is a variable that stores a single unit of data at a time. The data that will be stored by the scalar variable can be of the different type like string, character, floating point, a large group of strings or it can be a webpage and so on. Example :    

Output :    

Numeric Scalars

Numeric scalar variables hold values like whole numbers, integers(positive and negative), float(containing decimal point). The following example demonstrates different types of numerical scalar variables in perl. Example :    

String Scalars

String scalar variables hold values like a word(made of different characters), a group of words or a paragraph. The following example demonstrates different types of string scalar variables. Example :  

Please Login to comment...

Similar read thumbnail

  • arorakashish0911
  • perl-basics
  • Perl-Scalars

Please write us at contrib[email protected] to report any issue with the above content

Improve your Coding Skills with Practice


  • Language Basics
  • Regular Expression
  • System Functions

Convert array to scalar : Array Scalar « Array « Perl

  • Array Scalar

Back to Seekers of Perl Wisdom

www . com | www . net | www . org

  • GrandFather
  • eyepopslikeamosquito
  • Seekers of Perl Wisdom
  • Cool Uses for Perl
  • Meditations
  • PerlMonks Discussion
  • Categorized Q&A
  • Obfuscated Code
  • Perl Poetry
  • PerlMonks FAQ
  • Guide to the Monastery
  • What's New at PerlMonks
  • Voting/Experience System
  • Other Info Sources
  • Nodes You Wrote
  • Super Search
  • List Nodes By Users
  • Newest Nodes
  • Recently Active Threads
  • Selected Best Nodes
  • Worst Nodes
  • Saints in our Book
  • The St. Larry Wall Shrine
  • Offering Plate
  • Random Node
  • [id://781756|Buy PerlMonks Gear]
  • [Snippets Section|Snippets]
  • [Code Catacombs]
  • [Editor Requests]
  • blogs.perl.org
  • [http://planet.perl.org/|Planet Perl]
  • [http://ironman.enlightenedperl.org/|Perl Ironman Blog]
  • Perl Weekly
  • Perl Mongers
  • Perl Directory
  • Perl documentation


  1. PERL Tutorial

    perl assign array to scalar

  2. Perl Commands

    perl assign array to scalar

  3. Perl Commands

    perl assign array to scalar

  4. Learn about Scalar Variable in Perl Programming Language

    perl assign array to scalar

  5. Perl: Array vs Scalar Variables

    perl assign array to scalar

  6. Beginner Perl Maven tutorial: 5.4

    perl assign array to scalar


  1. Perl Programming Language

  2. Module 10 Arrays

  3. Perl Tutorial

  4. Informatics Practices|2023-2024|Grade 12|Data handling using pandas|Series Creation-PART 1

  5. Lecture-11: Scalar and Array Operations in MATLAB (Hindi/Urdu)

  6. Array-Backed Properties


  1. How the behavior is when assign an array to a scalar in perl?

    How the behavior is when assign an array to a scalar in perl? - Stack Overflow How the behavior is when assign an array to a scalar in perl? Ask Question Asked 6 years, 1 month ago Modified 3 months ago Viewed 890 times 0 My code is: my $r = ['111','222','aaa','bbb']; print $r; my $s = ('111','222','aaa','bbb'); print $s;

  2. Array in scalar context in Perl

    Array in scalar context in Perl Ask Question Asked 9 years, 11 months ago Modified 8 years, 4 months ago Viewed 870 times 0 In Perl, if you will assign an array to a scalar, you will get length of that array. Example: my @arr = (1,2,3,4); my $x = @arr; Now if you check the content of $x, you will find that $x contains the length of @arr array.

  3. Perl Array

    If you treat an array as a scalar, you will get the number of elements in the array. Take a look at the following code: my $count = @days; Code language: Perl (perl) However, this code causes an error in case you don't really want to count it but accidentally assign an array to a scalar. To be safe, use the scalar () function as follows:

  4. Can you force either a scalar or array ref to be an array in Perl

    Can you force either a scalar or array ref to be an array in Perl? Ask Question Asked 15 years, 2 months ago Modified 6 years, 5 months ago Viewed 14k times 28 I have a perl variable $results that gets returned from a service. The value is supposed to be an array, and $results should be an array reference.

  5. Scalar and List context in Perl, the size of an array

    Other languages would behave differently, but in Perl this assignment places the number of elements of the array in the scalar variable. That's arbitrary, and in the above case not very useful either, but there are a number of other cases when this behavior can be very useful. SCALAR and LIST context

  6. perldata

    Perl has three built-in data types: scalars, arrays of scalars, and associative arrays of scalars, known as "hashes". A scalar is a single string (of any size, limited only by the available memory), number, or a reference to something (which will be discussed in perlref ).

  7. Arrays

    The size or length of the array can be evaluated by the scalar context of the array or by using the scalar variable value of the last array element. The scalar context is refered to by scalar @array. The last array element is refered to by $#array. If @array is empty, the value of $#array is -1.

  8. Perl

    Array elements and hash values are scalars, so when you are nesting arrays and hashes, you must use references. Just as $authors-> [$x] is not a hash but a reference to a hash, you must set $authors-> [$x]-> {'books'} to a reference to the array.

  9. Scalar variables

    Variables in Perl are always preceded with a sign called a sigil. These signs are $ for scalars, @ for arrays, and % for hashes. A scalar can contain a single value such as a number or a string. It can also contain a reference to another data structure that we'll address later.

  10. Perl

    Perl - Arrays An array is a variable that stores an ordered list of scalar values. Array variables are preceded by an "at" (@) sign. To refer to a single element of an array, you will use the dollar sign ($) with the variable name followed by the index of the element in square brackets. Here is a simple example of using the array variables −

  11. Assigning an array to a scalar

    Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question: Is there a way, without using for or foreach to assign the contents of an array to a scalar? ... Re^2: Assigning an array to a scalar by ysth (Canon) on Sep 26, 2004 at 06:53 UTC.

  12. perlref

    Perl now not only makes it easier to use symbolic references to variables, but also lets you have "hard" references to any piece of data or code. Any scalar may hold a hard reference.

  13. Perl

    In Perl, array is a special type of variable. The array is used to store the list of values and each object of the list is termed as an element. Elements can either be a number, string, or any type of scalar data including another variable. Example: @number = (50, 70, 46); @names = ("Geeks", "For", "Geeks");

  14. Variables

    This section describes Perl variable types: Scalar, Array, and Hash. Variable names must be prefixed with special symbols to indicate their types, $, @ and %. Perl supports 3 types of variables: Scalar, Array, and Hash. 1. Scalar Variable - A variable to hold a scalar value. The name of a scalar variable must be prefixed with the dollar sign ...

  15. Perl

    Introduction: In Perl, function calls, terms, and statements have inconsistent explications which rely upon its Context. There are two crucial Contexts in Perl, namely List Context and Scalar Context. In a list context, Perl gives the list of elements. But in a scalar context, it returns the number of elements in the array.

  16. Assigning elements of an array to scalars

    See MJD's Why it's stupid to `use a variable as a variable name' for more discussion (although that's more on hashes rather than arrays the concept's the same). Re: Assigning elements of an array to scalars by toolic (Bishop) on Oct 10, 2007 at 16:16 UTC: Here is one way to do what I think you want to do:

  17. Perl

    A scalar is a variable that stores a single unit of data at a time. The data that will be stored by the scalar variable can be of the different type like string, character, floating point, a large group of strings or it can be a webpage and so on.

  18. Convert array to scalar : Array Scalar « Array « Perl

    Use a scalar variable as our subscript: 3. Assign array variable to scalar variable: 4. Split a scalar to create a list: 5. Assign array value to a list of scalar variables: 6. Assigning an array value to a scalar variabe: 7. Reference single array element by using the $ not @ 8. Scalar Data in an Array: 9. Place scalar variables in lists and ...

  19. Assign scalar to array

    Re^2: Assign scalar to array by ikegami (Patriarch) on May 18, 2010 at 16:30 UTC. The \ is an operator, and \ has no effect inside double quotes. That's not true. It most definitely had an effect (escaped the "@" to prevent interpolation). Just not the desired one. Re^3: Assign scalar to array by topteam (Initiate) on May 18, 2010 at 16:49 UTC