【问题标题】:Perl seems to require an external module to use the builtin sysopenPerl 似乎需要一个外部模块才能使用内置的 sysopen
【发布时间】:2021-03-22 03:06:09
【问题描述】:
$ perl -e 'use strict subs; print sysopen(my $temp, "./myfile.txt", O_RDONLY);'
Bareword "O_RDONLY" not allowed while "strict subs" in use at -e line 1

如果你在命令行上运行它,你会得到那个错误。我明白为什么这是一个错误,解决方案是use Fnctl,但这是必须安装在盒子上的东西。人们对 Perl 有足够多的抱怨,而我正试图给他们一个工具来(秘密地)展示 Perl 的有用性以及它(可能)有多么少的麻烦。这没有帮助。

我正在尝试编写一个 Perl 实用程序,人们可以将其用作单个文件,而无需安装外部库。为什么内置需要外部模块?我知道O_RDONLY 在不同的操作系统上可能会有所不同,但STDINSTDERRSTDOUT 也可能不同,但它们可以与use strict subs 一起使用。

【问题讨论】:

  • 如果你想证明简单,为什么要使用sysopen? 99% 的时间,open 会以更少的麻烦做你想做的事。
  • 如果您不想让别人安装东西,请随您的代码一起发布!见metacpan.org/pod/App::FatPacker
  • 我在使用散列中的老式 Perl 文件句柄(键文件名、值句柄)时遇到了问题。当我取回手柄时,它不起作用。另外,由于这是我正在编写的“尾部”命令,因此我宁愿以更大的“吞咽”方式读取文件中的添加内容,而不是一次一行。
  • @WaltHoward,文件句柄可以更多地存储在哈希中,没有问题。 print $hash{key} "string" 不起作用,但 print { $hash{key} } "string" 会。

标签: perl strict


【解决方案1】:

为什么内置模块需要外部模块?

Fcntl 不是外部模块。它是 Perl 附带的标准模块。如果加载失败,则 Perl 没有正确安装。但是,如果您愿意,可以使用数值检查其值并改用它:perl -MFcntl -E 'say O_RDONLY'

【讨论】:

  • 你是对的!!!这是安装被破坏的远程机器。
【解决方案2】:

可以通过corelist查看模块状态,perl自带:

$ corelist Fcntl

Data for 2020-06-20
Fcntl was first released with perl 5

$ corelist Module::CoreList

Data for 2020-06-20
Module::CoreList was first released with perl v5.8.9

STDOUTSTDERRSTDIN 句柄是 Perl 特殊变量,它们知道在编译 perl 时它们应该是什么。 Perl 不会抱怨它免费提供给您的任何变量 (perlvar)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 2019-02-17
    • 1970-01-01
    • 2015-05-03
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    相关资源
    最近更新 更多