【问题标题】:How to write a subroutine to clean a string [duplicate]如何编写子程序来清理字符串[重复]
【发布时间】:2014-11-26 20:48:26
【问题描述】:

我问a question here

我想做一个子程序来清理这样的字符串:

use strict;
use warnings;

sub cleanData($arg) {

    #remove A and B from string

    my $final_data = $arg;

    $final_data =~ s/A// ;
    $final_data =~ s/B/ /;

    print "final data: $final_data\n";

    return $final_data;

}

my $data = "11-A : 000-2B6888-00";
cleanData($data);

但我收到以下错误:

Illegal character in prototype for main::cleanData : $arg at Demo.pl line 4.

Global symbol "$arg" requires explicit package name at Demo.pl line 8.

Not enough arguments for main::cleanData at Demo.pl line 20, near "$data)"

Execution of Demo.pl aborted due to compilation errors.

【问题讨论】:

标签: perl


【解决方案1】:

你想要:

sub cleanData {
    my $final_data = shift;
...

你可能想写更多的参数:

sub cleanData {
    my ($final_data, $delete_re, $replace_re) = @_;

当然,如果它更符合您的审美,对单个元素使用列表分配并没有错。

sub cleanData {
    my ($final_data) = @_;

如果您使用的是非常现代版本的 Perl,以及 v5.20 及更高版本,您可以添加:

no warnings "experimental::signatures";

到您当前的代码,您将能够使用最前沿的 Perl。

【讨论】:

  • cmd: perl -v.我正在使用版本 5.x。但是你的方法不需要 arg !
  • @big_space Perl 中的参数通过@_ 传递。 shift 删除第一个元素 ($_[0]) 并将其复制到 $final_data。如果你坚持让你的代码看起来像你最喜欢的其他语言,你可以声明sub cleanData ($) {,但大多数有经验的 Perl 程序员不建议这样做。或者,在 5.20 中,您可以使用“签名”功能......
  • "bleeding edge Perl" 意味着危险代码?
  • "experimental" 表示语法可能会改变。使用实验性功能可能会导致您的代码与 Perl 的未来版本不兼容。
【解决方案2】:

问题在于您用于声明函数和访问其参数的语法。

看看perldoc perlsub:那里有很多关于如何做这两件事的例子。

【讨论】:

  • @big_space:我相信你的首选语言比 Perl 更“蹩脚”;我可以在不知道它是什么的情况下对它提出许多指控。如果您对自己所写内容的信念是真实的,那么您肯定选择了错误的职业。
  • @big_space 我当然不会声称已经存在 20 多年的语言很糟糕。即使是某些特定的任务,它也一定有好处,不是吗?
  • @DWilches:我不会试图和这个人讲道理。我敢肯定他的编程经验很少,而且是故意无知,虽然我无法想象他可能有什么动机。
  • @DWilches - 实际上,我别无选择。我所学的东西几乎不足以制作一些简单的 4-5 脚本。在那之后,我再也不需要使用 if 1-2 年或更长时间了。如果这是我工作的主要部分,我会详细学习它——教科书等等。对于只想学习足以制作脏脚本的人来说,这太令人沮丧了。红宝石永远不会发生。
  • @big_space:我确信你的态度是故意冒犯的,我很惊讶你收到任何答案。我猜有些人会为了声望点做任何事。我开设了编程课程,并且由于其公开的方法调用机制,我发现 Perl 是迄今为止作为第一语言教授的最佳语言。我不清楚 "Never occur with ruby​​" 可能意味着什么,但是 Ruby 的链接语法让大多数初学者很难理解,除非他们熟悉在 Bash 中使用管道链接命令。请尽量不要那么讨厌。
猜你喜欢
  • 2020-01-24
  • 2019-12-22
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
相关资源
最近更新 更多