【问题标题】:How to implement files?如何实现文件?
【发布时间】:2018-09-17 01:28:49
【问题描述】:

假设我在一个文件中有一些记录:

ID Name Age Salary Phone
1  Ram  60  100   123456789000
2  tam  30  200   7436674776
3  sam  20  300   3734837837
4  kim  30  400   2

如何显示所有没有有效电话号码的人的详细信息?

这就是我所做的:

open(f, <Users);
my @col = map { (split)[4] } split /\n/, f; # Phone numbers are stored in an array

foreach my $i ( @col ) {

    if ( grep -v /[[:digit:]]{10}/, @col ) {

        print "grep success\n";
        print "$i";
    }
}

但是我遇到了很多错误。

我还有其他问题,比如如果这个人的经验 > 20 年,我如何将薪水修改 15%?

【问题讨论】:

  • 什么是有效的电话号码?只有 10 位数字,没有分隔符?根据您提供的数据,不可能知道某人有多少经验——我们只有他们的年龄!
  • 这段代码严重损坏,甚至无法编译。
  • “请告诉我正确的语法...”不,那是你的工作。 perl.org/learn.html
  • use warnings; use strict; 添加到您的代码中,然后了解如何正确读取文件perldoc.perl.org/perlopentut.html

标签: perl file


【解决方案1】:

看来您只是通过猜测语法来编写代码。除非您非常幸运(而我们大多数人都没有那么幸运),否则这不太可能奏效。

我建议您退后一步,找到 Perl 语法的 a good resource that can teach you the basics - 因为您目前显然遇到了麻烦。

现有代码中的前两个错误是由代码中的简单拼写错误引起的。您使用以下代码打开文件:

open(f, <Users);

但是文件名和打开方式需要用引号括起来。

open(f, '<Users');

但是,通常认为 a) 使用词法变量作为文件句柄是一种好的做法。

open(my $f, '<Users');

b) 将打开模式和文件名作为 open() 的单独参数。

open(my $f, '<', 'Users');

并且 c) 检查来自 open() 的返回值并采取适当的措施。

open(my $f, '<', 'Users') or die "Cannot open 'Users': $!\n";

其次,您尝试仅使用文件名来读取文件句柄。

... split /\n/, f;

但您需要使用文件输入运算符 (&lt; ... &gt;) 从文件句柄中读取数据。

... split /\n/, <f>;

如果你听从我的建议,改用词法变量作为文件句柄。

... split /\n/, <$f>;

我强烈建议您养成在所有 Perl 代码中添加 use strictuse warnings 的习惯,然后了解并解决它们揭示的所有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2013-03-08
    • 1970-01-01
    • 2020-09-07
    • 2021-03-19
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多