diff --git a/src/pl/plperl/expected/plperl.out b/src/pl/plperl/expected/plperl.out
index ebfba3eb8d..d8a1ff5dd8 100644
--- a/src/pl/plperl/expected/plperl.out
+++ b/src/pl/plperl/expected/plperl.out
@@ -763,14 +763,17 @@ $$ LANGUAGE plperl;
 SELECT text_obj();
 ERROR:  cannot convert Perl hash to non-composite type text
 CONTEXT:  PL/Perl function "text_obj"
------ make sure we can't return a scalar ref
+-- test looking through a scalar ref
 CREATE OR REPLACE FUNCTION text_scalarref() RETURNS text AS $$
 	my $str = 'str';
 	return \$str;
 $$ LANGUAGE plperl;
 SELECT text_scalarref();
-ERROR:  PL/Perl function must return reference to hash or array
-CONTEXT:  PL/Perl function "text_scalarref"
+ text_scalarref 
+----------------
+ str
+(1 row)
+
 -- check safe behavior when a function body is replaced during execution
 CREATE OR REPLACE FUNCTION self_modify(INTEGER) RETURNS INTEGER AS $$
    spi_exec_query('CREATE OR REPLACE FUNCTION self_modify(INTEGER) RETURNS INTEGER AS \'return $_[0] * 3;\' LANGUAGE plperl;');
diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c
index 4342c02b27..4cfc506253 100644
--- a/src/pl/plperl/plperl.c
+++ b/src/pl/plperl/plperl.c
@@ -1402,11 +1402,13 @@ plperl_sv_to_datum(SV *sv, Oid typid, int32 typmod,
 			return ret;
 		}
 
-		/* Reference, but not reference to hash or array ... */
-		ereport(ERROR,
-				(errcode(ERRCODE_DATATYPE_MISMATCH),
-				 errmsg("PL/Perl function must return reference to hash or array")));
-		return (Datum) 0;		/* shut up compiler */
+		/*
+		 * If it's a reference to something else, such as a scalar, just
+		 * recursively look through the reference.
+		 */
+		return plperl_sv_to_datum(SvRV(sv), typid, typmod,
+								  fcinfo, finfo, typioparam,
+								  isnull);
 	}
 	else
 	{
diff --git a/src/pl/plperl/sql/plperl.sql b/src/pl/plperl/sql/plperl.sql
index c36da0ff04..b0d950b230 100644
--- a/src/pl/plperl/sql/plperl.sql
+++ b/src/pl/plperl/sql/plperl.sql
@@ -504,7 +504,7 @@ $$ LANGUAGE plperl;
 
 SELECT text_obj();
 
------ make sure we can't return a scalar ref
+-- test looking through a scalar ref
 CREATE OR REPLACE FUNCTION text_scalarref() RETURNS text AS $$
 	my $str = 'str';
 	return \$str;