package Module::Build::YAML;
use strict;
-use warnings;
+use vars qw($VERSION);
+$VERSION = '0.2808_01';
+$VERSION = eval $VERSION;
-our $VERSION = "0.50";
-our @EXPORT = ();
-our @EXPORT_OK = qw(Dump Load DumpFile LoadFile);
+use vars qw($VERSION @EXPORT @EXPORT_OK);
+$VERSION = "0.50";
+@EXPORT = ();
+@EXPORT_OK = qw(Dump Load DumpFile LoadFile);
sub new {
my $this = shift;
if ($filename =~ /^\s*(>{1,2})\s*(.*)$/) {
($mode, $filename) = ($1, $2);
}
- open my $OUT, $mode, $filename
+ open my $OUT, "$mode $filename"
or die "Can't open $filename for writing: $!";
print $OUT Dump(@_);
close $OUT;
}
sub _yaml_value {
- # XXX doesn't handle embedded newlines
my ($value) = @_;
- # undefs and empty strings will become empty strings
- if (! defined $value || $value eq "") {
- return('""');
- }
+ # undefs become ~
+ return '~' if not defined $value;
+
+ # empty strings will become empty strings
+ return '""' if $value eq '';
+
# allow simple scalars (without embedded quote chars) to be unquoted
- elsif ($value !~ /["'\\]/) {
- return($value);
- }
- # strings without double-quotes get double-quoted
- elsif ($value !~ /\"/) {
- $value =~ s{\\}{\\\\}g;
- return qq{"$value"};
- }
- # other strings get single-quoted
- else {
- $value =~ s{([\\'])}{\\$1}g;
- return qq{'$value'};
- }
+ # (includes $%_+=-\;:,./)
+ return $value if $value !~ /["'`~\n!\@\#^\&\*\(\)\{\}\[\]\|<>\?]/;
+
+ # quote and escape strings with special values
+ return "'$value'"
+ if $value !~ /['`~\n!\#^\&\*\(\)\{\}\[\]\|\?]/; # nothing but " or @ or < or > (email addresses)
+
+ $value =~ s/\n/\\n/g; # handle embedded newlines
+ $value =~ s/"/\\"/g; # handle embedded quotes
+ return qq{"$value"};
}
1;