---
name: "Perl6::Say"
section: "3pm"
platform: "linux"
package: "libperl6-say-perl"
version: "0.16-3"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Perl6::Say"
---

# Perl6::Say(3pm)

"print()", but no newline needed

## NAME

Perl6::Say - "print()", but no newline needed

## SYNOPSIS

```
    # Perl 5 code...
    use Perl6::Say;
    say 'boo';             # same as:  print 'boo', "\n"
    say STDERR 'boo';      # same as:  print STDERR 'boo', "\n"
    STDERR->say('boo');    # same as:  print STDERR 'boo', \n"
    $fh->say('boo');       # same as:  print $fh 'boo', "\n";
    say();                 # same as:  print "$_\n";
    say undef;             # same as:  print "\n";
```

## DESCRIPTION

### Note for Users of Perl 5.10

You don't need this module.  The Perl 6 `"say"` function is available in Perl 5.10 by saying `"use feature 'say';"`.  Hence, this module is of interest only to users of Perl 5.6 and 5.8.

If you have Perl 5.10 installed, see the *510/* directory in this distribution for some elementary examples of `"say"` taken from `"perldoc` `feature"`.

### General

Implements a close simulation of the `"say"` function in Perl 6, which acts like `"print"` but automatically appends a newline.

Use it just like `"print"` (except that it only supports the indirect object syntax when the stream is a bareword). That is, assuming the relevant filehandles are open for output, you can use any of these:

```
    say @data;
    say FH @data;
    FH->say(@data);
    *FH->say(@data);
    (\*FH)->say(@data);
    say $fh, @data;
    $fh->say(@data);
```

but not any of these:

```
    say {FH} @data;
    say {*FH} @data;
    say {\*FH} @data;
    say $fh @data;
    say {$fh} @data;
```

### Additional Permitted Usages

As demonstrated in the test suite accompanying this distribution, `"Perl6::Say::say()"` can be used in all the following situations.

```
    $string = q{};
    open FH, ">", \$string;
    say FH qq{Hello World};            # print to a string
    close FH;                          # requires Perl 5.8.0 or later
    use FileHandle;
    $fh = FileHandle->new($file, 'w');
    if (defined $fh) {
        say $fh, qq{Hello World};
        $fh->close;
    }
    use IO::File;
    $fh = IO::File->new($file, 'w');
    if (defined $fh) {
        say $fh, qq{Hello World};
        $fh->close;
    }
    $string = q{};
    open FH, ">", \$string;             # requires Perl 5.8.0 or later
    select(FH);
    say qq{Hello World};
    close FH;
```

### Interaction with Output Record Separator

In Perl 6, `"say @stuff"` is exactly equivalent to `"Core::print @stuff, "\n""`.

That means that a call to `"say"` appends any output record separator (ORS) *after* the added newline (though in Perl 6, the ORS is an attribute of the filehandle being used, rather than a global `$/` variable).

### "IO::Handle::say()"

IO::Handle version 1.27 or later (which, confusingly, is found in IO distribution 1.23 and later) also implements a `"say"` method.   Perl6::Say provides its own `"say"` method to IO::Handle if `"IO::Handle::say"` is not available.

### Usage with Older Perls

As noted above, some aspects of `"Perl6::Say::say()"` will not work with versions of Perl earlier than 5.8.0.  This is not due to any problem with this module; it is simply that Perl did not support printing to an in-memory file (`"print \$string, "\n";"`) prior to that point.  (Thanks to a CPAN testers report from David Cantrell for identifying this limitation.)

## WARNING

The syntax and semantics of Perl 6 is still being finalized and consequently is at any time subject to change. That means the same caveat applies to this module.

## DEPENDENCIES

No dependencies other than on modules included with the Perl core as of version 5.8.0.

Some of the files in the test suite accompanying this distribution use non-core CPAN module IO::Capture::Stdout.  Tests calling IO::Capture::Stdout methods are enclosed in `"SKIP"` blocks and so should pose no obstacle to installation of the distribution on systems lacking IO::Capture.  (However, the maintainer strongly recommends IO::Capture for developers who write a lot of test code.  So please consider installing it!)

## AUTHOR and MAINTAINER

### AUTHOR

Damian Conway (damian@conway.org).

### MAINTAINER

Alexandr Ciornii (alexchorny@gmail.com)

## ACKNOWLEDGMENTS

Thanks to Damian Conway for dreaming this up.  Thanks to David A Golden for a close review of the documentation.  Thanks to CPAN tester Jost Krieger for reporting an error in my SKIP block count in one test file.

## BUGS AND IRRITATIONS

As far as we can determine, Perl 5 doesn't allow us to create a subroutine that truly acts like `"print"`. That is, one that can simultaneously be used like so:

```
    say @data;
```

and like so:

```
    say {$fh} @data;
```

Comments, suggestions, and patches welcome.

## COPYRIGHT

Copyright (c) 2004, Damian Conway. All Rights Reserved. This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.
