【问题标题】:Failing to produce a simple output with nix and perl无法使用 nix 和 perl 生成简单的输出
【发布时间】:2021-03-02 11:20:25
【问题描述】:

我正在使用这个脚本:

use strict;
use warnings;

my $output_file= %ENV{'out'};
open( my $out, ">", $output_file)
  or die "No se puede abrir $output_file: $!";
print $out %ENV;
close $out;

有了这个 nix 推导:

d = derivation { name = "dot.env"; builder = "${perl}/bin/perl" ; args=[ ejemplos/nix/env.pl ]; system = "x86_64-linux"; }

但是,构建该派生(使用:b d)反复失败,在商店目录中仅生成.lock。即使我删除了锁定文件,它仍然失败。有什么想法吗?

【问题讨论】:

  • 对我来说这不是故事的全部吗?我的意思是,是什么创建了.lock 文件?不是那么简单的代码,或者我的 Perl 太生疏了 :-)
  • @lizmat 实际上,它是做什么的。但也许我应该澄清一下。

标签: nix build-tools


【解决方案1】:
  1. %ENV{'out'} 将生成键/值切片。可以在您的示例中使用,但正确的变体是 $ENV{'out'}。 use warnings 已启用,因此您可以阅读 STDERR 中的错​​误印记。
  2. print $out %ENV; 是个坏主意,因为每次执行都会产生混乱的输出,其中包含以随机顺序连接的键和值:
#!/usr/bin/env perl

use strict;
use warnings;

%ENV = ( foo => 1, bar => 2, baz => 3 );
open (my $fh, '>', './2') or die $!;
print $fh %ENV;

# 1st run
# bar2baz3foo1
# second
# foo1bar2baz3
# third
# bar2foo1baz3

您还可以检查close() 是否有错误。并非所有错误打开后都能处理,例如:

perl -E'open ( my $fh, ">", "/dev/full" ) or die "No error?"; print $fh "123"; close($fh) or die $!'

【讨论】:

  • 我其实想打印整个环境。 %ENV 包含环境变量。
  • 更多人类可读的解决方案可以是:使用Data::Dumper;打印转储器 \%ENV;
  • 非常感谢您的努力,但这并不是真正的问题。问题是它没有产生任何输出,而是一个nix 错误。
猜你喜欢
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
  • 2016-05-24
  • 2011-05-16
  • 2014-03-30
相关资源
最近更新 更多