函数和子程序有什么区别?有人告诉我,函数和子程序之间的区别如下:
函数接受参数,在本地工作,不会改变任何值或使用其范围之外的任何值(高内聚).它还返回一些值.子程序直接与调用它的调用者或代码段的值一起工作,并且不返回值(低内聚),即将一些代码分支到其他代码以便进行一些处理并返回.
这是真的?或者没有区别,只有两个术语来表示一个?
我似乎反对这个问题很多,我的数据格式如下:
+----+----------------------+
| id | colors |
+----+----------------------+
| 1 | Red,Green,Blue |
| 2 | Orangered,Periwinkle |
+----+----------------------+
Run Code Online (Sandbox Code Playgroud)
但我希望它的格式如下:
+----+------------+
| id | colors |
+----+------------+
| 1 | Red |
| 1 | Green |
| 1 | Blue |
| 2 | Orangered |
| 2 | Periwinkle |
+----+------------+
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?什么是这种操作甚至叫做?
所以我有一个情况,我有一个带有两个命名参数的函数,但如果两个都使用,函数需要死.我不确定这是否是一个错误,或者是否存在内在的东西,我不了解Perl变量.
这是简化的代码:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
foreach my $number (1..5)
{
fooBar(foo => $number);
}
sub fooBar
{
my %args = (
foo => undef,
bar => undef,
@_
);
my $foo = $args{foo} if defined $args{foo};
my @bar = @{$args{bar}} if defined $args{bar};
print Dumper(\@bar);
if (defined $foo)
{
die('fooBar() received both a foo and a bar and didn\'t know which to use!') if @bar;
push(@bar, $foo);
}
print Dumper(\@bar);
return (\@bar);
}
# > $VAR1 …Run Code Online (Sandbox Code Playgroud) 我经常遇到这样的查询:
SELECT
a.Id,
a.A,
a.B,
a.C,
SUM(b.Foo) AS foo
FROM
TableA AS a
JOIN TableB AS b
ON a.Id = b.TableAId
GROUP BY a.Id;
Run Code Online (Sandbox Code Playgroud)
在SQL Server(如果ONLY_FULL_GROUP_BY为true,则为MySQL )中,此查询也不好。一切都必须是a)聚合函数中的,或b)中的GROUP BY。
我的问题是,这两种解决方案看起来都很糟糕并且具有误导性。如果您选择了一个随机的聚合函数,MAX()您将得到:
SELECT
a.Id,
MAX(a.A) AS A,
MAX(a.B) AS B,
MAX(a.C) AS C,
SUM(b.Foo) AS foo
FROM
TableA AS a
JOIN TableB AS b
ON a.Id = b.TableAId
GROUP BY a.Id;
Run Code Online (Sandbox Code Playgroud)
该查询看起来像我们关心a.A,a.B和的最大值a.C,并且混淆了最大值没有意义的事实。
GROUP BY 好一点:
SELECT
a.Id,
a.A,
a.B,
a.C,
SUM(b.Foo) …Run Code Online (Sandbox Code Playgroud) mysql ×2
aggregation ×1
csv ×1
format ×1
group-concat ×1
perl ×1
pivot ×1
sql ×1
sql-server ×1
subroutine ×1
terminology ×1