Perl初心者スレ(マジレス回答)

1デフォルトの名無しさん2012/10/07(日) 00:48:39.00
どうぞー

394デフォルトの名無しさん2016/11/24(木) 21:29:28.37ID:Puznaqkq
perlの本を読んでいると、よく
「スカラーコンテキストでは〜」とか「リストコンテキストでは〜」とありますが
どのようなところで、分かるのでしょうか?

$a = grep /d/ ,qw<ab cd def>;
なんかgrepがスカラーコンテキストで使われていると思うんですが

if(grep /d/ ,qw<ab cd def>){}
だとなぜスカラーコンテキストだと分かるのでしょうか?

395デフォルトの名無しさん2016/11/24(木) 21:43:25.96ID:ws/Ij8QD
真偽値だからスカラーコンテキスト

396デフォルトの名無しさん2016/11/24(木) 22:50:56.11ID:Puznaqkq
ありがとうございます
理解できました。

397デフォルトの名無しさん2016/11/28(月) 20:34:11.39ID:5mxcw3wW
shiftjisのファイルを読み込むと「{」が「本」にマッチしちゃうんですがいい方法ありませんか?

398デフォルトの名無しさん2016/11/29(火) 00:14:31.38ID:y3Pzho4d
基本全部utf8で処理する

399デフォルトの名無しさん2016/11/29(火) 00:38:56.85ID:p0rBFEu6
ファイルを読み込むときにperlに文字コードを教えてあげるとバイト単位ではなくて文字単位で認識してもらえるようになる
open my $fh, '<:encoding(cp932)', $file or die $!;

正規表現を含むソースコード全体をUTF8で書き、スコープの上の方で use utf8; と宣言すればスコープ内のコードも文字単位で認識されるようになる

400デフォルトの名無しさん2016/11/29(火) 08:02:41.28ID:lSOeahl6
>>399
レスありがとうございます。
試してみます。
取り急ぎお礼まで。

401デフォルトの名無しさん2017/02/26(日) 22:46:53.99ID:UaR+28E8
以下エラーが出たため、ググると、似たエラーのQ and Aがありました。
Q and A では "if(defined(%hash))"を"if(%hash)"にしろと読めたので、倣うと確かにエラーは解消されました。
理屈はまるで分からないのですが、%記号のついた変数のときだけdefinedを削る理由は何なのでしょうか。

エラー: Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at ./w3mhelp.cgi line 51.
Q and A: https://github.com/bioconda/bioconda-recipes/issues/1254

402デフォルトの名無しさん2017/02/26(日) 23:46:32.86ID:03Ms8vp8
>>401
すごく古い Perl (例えば 5.005_03) だと、defined %hash はエラーにならず 0 か 1 が返ってきていた。
だが今やこの機能は廃止された。

http://perldoc.jp/func/defined
> 集合(ハッシュや配列)への defined の使用は非推奨です。
> これはその集合にメモリが割り当てられたかを報告するのに用いられていました。
> この振る舞いは将来のバージョンの Perl では消滅するかもしれません。

ハッシュ変数自体をスカラーコンテキストで評価すると「利用バケット数/確保バケット数」のような値が
返ってきて、これは昔から変わらない。内容が完全に未定義 = キーが一つも無ければ 0 が返される。
よって if (%hash) { ... } は、意味や挙動的には if (keys %hash) { ... } と同じ。

my %hash;
printf "%s, %d\n", scalar %hash, scalar keys %hash; # 0, 0
$hash{udnef} = undef;
printf "%s, %d\n", scalar %hash, scalar keys %hash; # 1/8, 1
%hash = ();
printf "%s, %d\n", scalar %hash, scalar keys %hash; # 0, 0

http://d.hatena.ne.jp/yumatsumo/20071207/1197002522

403デフォルトの名無しさん2017/02/27(月) 00:03:03.35ID:JWhb7pSm
ttps://perldoc.jp/docs/perl/5.22.0/perl5220delta.pod#defined40-64array41-32and32defined40-37hash41-32are32now32fatal32errors
>defined(@array) と defined(%hash) は致命的エラーになりました
>これは v5.6.1 から廃止予定で、v5.16 から廃止予定警告が出力されていました。

v5.6.1は2001年、v5.16は2012年、実際に廃止されたv5.22は2015年にリリース

ttps://www.effectiveperlprogramming.com/2016/06/perl-v5-26-new-features/
>A hash is scalar context will return the number of keys, not the hash statistics.
今年リリース予定のv5.26からはスカラーコンテキストのハッシュが返す値はハッシュの持つキーの数になるそうです

404デフォルトの名無しさん2018/02/03(土) 21:51:51.42ID:UEj2CeXM
Perl初心者です。独学でやり始めましたが、わからないことがあり、先輩方、何卒よろしくお願いします。

my $num = 1;
my $inc = $num++;
print “$num¥n”;
print “$inc¥n”;

変数$numは2と表示されますが、変数$incは1と表示さます。こらは仕様でしょうか。変数$incについても2が表示されると思ってたのですが。
C言語では右辺を評価した後に左辺に代入して、2が表示してたかな、と思ったので質問させていただきます。

405デフォルトの名無しさん2018/02/03(土) 22:48:45.47ID:oNG+vmom
>>404
Cでも++演算子は同様の結果になると思ったが?

406デフォルトの名無しさん2018/02/03(土) 22:55:48.24ID:UEj2CeXM
>>405
本当ですね。もっと確認してから質問するべきでした。
やりたかったことは
$inc = ++$num(
でした。C言語と同じですね。

ご教授頂きまして、どうもありがとうございました。

407デフォルトの名無しさん2018/02/03(土) 22:57:16.17ID:UEj2CeXM
>>406

$inc = ++$num;

の間違いです。

408デフォルトの名無しさん2018/05/23(水) 20:30:23.86ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

WVNXN

409デフォルトの名無しさん2018/05/24(木) 02:11:41.40ID:zOcuDZ4P
perlやってみたいど素人です。
Ubuntu 18.04がメインのマシンです
Windows XPサポート終了後難民となり
Ubuntu 16.04に辿りついてます
Ubuntuもまだまだど素人ですけど
通常に動かす所まではできます
Perlはどこから?始めたらいいでしょう
本買った方がいいのかな?

410デフォルトの名無しさん2018/05/24(木) 02:11:43.82ID:zOcuDZ4P
perlやってみたいど素人です。
Ubuntu 18.04がメインのマシンです
Windows XPサポート終了後難民となり
Ubuntu 16.04に辿りついてます
Ubuntuもまだまだど素人ですけど
通常に動かす所まではできます
Perlはどこから?始めたらいいでしょう
本買った方がいいのかな?

411デフォルトの名無しさん2018/05/24(木) 07:46:52.51ID:8nuNm7XP
どのみち本は買った方がいいと思うけど
初心者から始めるならこんなのもあるみたいよ(宣伝乙)
http://www.perl-entrance.org/

412デフォルトの名無しさん2018/05/24(木) 11:20:03.99ID:4N/yOXRV
>>411
独学派なんです。

413デフォルトの名無しさん2018/06/20(水) 03:35:44.14ID:CuTzdQY9
perlに初心者がつくとは。。perlの未来は明るい

414デフォルトの名無しさん2018/06/20(水) 20:53:58.17ID:Va19lMsb
Perl 6の“Neko operator”を使ってみたいのですがどのように使用すればいいでしょうか。
> 0 ^..^ 9
> say "0 ^..^ 9"
などとやっても
0 ^..^ 9
という文字列(?)が返ってくるだけなのですが……。

415デフォルトの名無しさん2018/06/22(金) 02:01:50.03ID:AmdeLsRG
Perl6は初心者なので全く分からない。
というかやろうとしたことすらないので知識ゼロw

416デフォルトの名無しさん2018/06/22(金) 08:56:04.63ID:Xz8qrSqH
perl6いつになったら実用的な実装出るのー?

417デフォルトの名無しさん2018/06/27(水) 17:36:19.05ID:rSBeNI25
>>414
すいませんどなたかこれ分かりませんか。

418デフォルトの名無しさん2018/06/28(木) 00:53:58.60ID:mceaYjQ2
>>417
perl6はまったく使ったことはないが、
範囲演算子らしいから
perl5の ... と同じように使うんじゃないのかね。
say $_ for 0 ^..^ 10;
みたいな? perl6の文法的にこれでいいかはわからんけど。

419デフォルトの名無しさん2018/06/28(木) 03:08:38.20ID:mceaYjQ2
perl5の範囲演算子 ... じゃなくて .. だったね。失礼。

420デフォルトの名無しさん2018/06/28(木) 13:40:00.67ID:n10gG+NH
>>418
できました。ありがとうございます。

421デフォルトの名無しさん2018/06/29(金) 22:13:55.33ID:jsqIPRMd
Neko演算子なんてあるのねw

422デフォルトの名無しさん2018/07/04(水) 22:52:04.22ID:gFgZc5FG
ANH

423デフォルトの名無しさん2018/07/06(金) 12:26:50.17ID:uTPDH9XV
ANH

424デフォルトの名無しさん2018/07/12(木) 14:35:34.31ID:EgbO6wCv
Perlの勉強始めました。

425デフォルトの名無しさん2018/07/12(木) 16:09:13.97ID:sm9NZXwJ
冷やし中華始めました。

426デフォルトの名無しさん2018/07/19(木) 12:24:17.38ID:0leqnnH4
Xorgってperlで描かれてるコマンドが多い気がするけどなんで?

427デフォルトの名無しさん2018/08/03(金) 22:49:39.26ID:G69i9RgI
なんだろう? 計算式で質問投稿しようとするとNGワードエラーで拒否られてしまう orz
全角でもダメかー

428427です2018/08/04(土) 19:04:46.45ID:pEPpCry/
これで書けるかな?

代入計算式のソースと書きたかった質問内容をマンゴースレに貼りました。
https://agree.5ch.net/test/read.cgi/mango/1532726276/421-422

429427です2018/08/04(土) 19:09:36.61ID:pEPpCry/
>428 の書き込みで、本来続きだった リンク先 >422 の
16進〜解説お願いできませんでしょうか?
の文章内だけでもNG含んでるとか・・・・プログラム技術板・・コミュニケーション終わってね?

430デフォルトの名無しさん2018/08/05(日) 06:11:20.74ID:cdvogGHQ
>>428
よくわからないんだけど、下2桁を60で割って3桁目より上は1の位にシフトしているわけだよね。
とするとあり得るのは時間の時と分について 時 * 100 + 分 とやった結果が数値として入っていて、
それの時間単位への変換ではないか?

例えば元の値が 315 なら3時間15分という意味で、それを時間単位に直すと 3.25 時間ってこと。

431デフォルトの名無しさん2018/08/05(日) 06:13:27.55ID:cdvogGHQ
時と分とは限らないか。分と秒かも知れない。まあしかし下2桁は60進法で考えなければいけないということに変わりはない。

432デフォルトの名無しさん2018/08/05(日) 07:50:18.49ID:cdvogGHQ
>>428
ところで元のプログラムに「16進バイナリデータを・・・」というコメントが入っているのだろうが、呼び出す側は実際には何を渡している?

仮に元がバイナリだったとしても unpack('N', ...) のようなことをしていない? だとするとそこでバイナリから Perl の
変数への変換自体は終わっている。

つまり、コメントが紛らわしい表現になっているだけ。

433427です これは書けるかな?2018/08/05(日) 12:21:43.54ID:gWGunr7x
>430-432 スミマセンです。 orz
もっと詳しく書こうとするとマンゴースレでもブロックされました。
ぶっちゃけ、この中の
ttp://motor.geocities.jp/resermail/dc10tools.zip
「dc10mov2csv.pl」内です。

gps_data{'latitude'}の部分からです

gps_data{'bearing'}の式は
変換が単精度浮動小数点数(float)のIEEE754 単精度float変換で合ってますか?

これをベースに別メーカー機種の同様な構造を持つデータでの他言語の変換プログラムを考えているので。

434デフォルトの名無しさん2018/08/05(日) 17:23:40.10ID:cdvogGHQ
>>433
pack, unpack の f は機種依存なので IEEE 754 単制度になるかどうかはプログラムからだけではわからない。
http://perldoc.jp/func/pack
まあでも今時の普通のPC用Perlならなってそうな気がするけどね。

latitude って緯度か。GPSデータのバイナリをPerlの変数に入れているということだな。
だから下2桁を60進法で考える必要があると。

やはりそのプログラムのコメントは紛らわしいってだけだよ(サブルーチン名も紛らわしいが)。
bin_convert 呼ぶときには既にバイナリから float に unpack されてるから。
で、bin_convert 内でやっているのは先に書いた通り下2桁を60進法で小数点以下の値にしてるってことね。

435427です2018/08/05(日) 21:57:54.47ID:gWGunr7x
>>434
ありがとうございます。
全体からずらして抜いたもの60進法にしてるだけなんですね。
てっきりバイナリから浮動小数点を出す特殊計算かと思っていました。
適当にがんばります。

436デフォルトの名無しさん2018/10/05(金) 20:29:10.24ID:ZpFL29Ml
「サンプル」のCSVを文末の「結果」に変換するプログラムをPerlで作りたいです。
● サンプルのCSVの構造:
1コラム目:数字8桁の昇順、2コラム目:数字1桁、3コラム目:文字列
● 作りたいプログラム:
1コラム目、3コラム目は保持する。複数レコードで1コラム目に重複があれば、
それらの複数レコードの2コラム目の1桁数字を連番にする。
1コラム目に重複がない場合は、当該レコードの2コラム目を1にする。

● 「サンプル」
06030002,6,文字列A
06030004,3,文字列B
06030004,4,文字列C
06030004,5,文字列D
06030005,3,文字列E
06030005,4,文字列F
06030006,3,文字列G
06030006,4,文字列H
06030006,7,文字列I
06030007,3,文字列J
06030008,3,文字列K
● 「結果」
06030002,1,文字列A
06030004,1,文字列B
06030004,2,文字列C
06030004,3,文字列D
06030005,1,文字列E
06030005,2,文字列F
06030006,1,文字列G
06030006,2,文字列H
06030006,3,文字列I
06030007,1,文字列J
06030008,1,文字列K

437デフォルトの名無しさん2018/10/05(金) 21:39:08.56ID:liWk4NPs
まずは自分で書いてみたコードを晒すところからだな。

438デフォルトの名無しさん2018/10/05(金) 22:57:27.02ID:kjx9soPU
一行プログラムが思い浮かんだ。

最初の列をハッシュのキーにして3列目をpush。
全部読んだらキーをソートして読んだ内容に番号降りつつ出力。

しかし俺は今電車の中からスマホで書いてるのでここに書く気が起きない。

439デフォルトの名無しさん2018/10/06(土) 00:22:39.61ID:mGKg2bAW
Ruby で作った

require 'csv'

count = Hash.new( 0 ) # 初期値は、0

# コロン区切りのCSV 入力ファイルを、1行ずつ処理する
CSV.foreach( "input.csv" ) do |row|
count[ row[ 0 ] ] += 1
row[ 1 ] = count[ row[ 0 ] ]

puts row.join( "," )
end

440デフォルトの名無しさん2018/10/06(土) 02:20:13.04ID:m3dYH3N7
考え方は >>439 と同じ

perl -pe "s/^([^,]+,)[^,]+/$1.++$count{$1}/e" < sample.csv

441デフォルトの名無しさん2018/10/06(土) 03:33:56.69ID:gPBhgV7B
my @y = "";
while(<>) {
my @x = split ",";
# $x[1] = $x[0] eq $y[0] && ++$y[1] || 1;
$x[1] = $x[0] ne $y[0] || ++$y[1];
print join ",", (@y = @x);
}
ウチでやるならこうかしら

4424382018/10/06(土) 06:07:28.44ID:J8Y2BFN6
おはよう。

元のテキストが s.txt に入っているとして、こうする。

perl -ne 'chomp;@d=split/,/;push(@{$h{$d[0]}},$d[2]);END{for(sort keys%h){for($i=0;$i<@{$h{$_}};$i++){print join(",",$_,$i+1,$h{$_}[$i])."\n"}}}' s.txt

なげーなw

4434382018/10/06(土) 06:21:52.15ID:J8Y2BFN6
あ、そうか。貯め込む必要はなくてハッシュ作ってそのまんま出せば良いんだよな。

じゃあawkの方が楽ではないか?

awk -F, 'BEGIN{OFS=","}{n[$1]++;print $1,n[$1],$3}' s.txt

444デフォルトの名無しさん2018/10/06(土) 17:28:12.58ID:MMGbFZjG
436です。皆様ありがとうございました。
自分では1行ずつ処理することまでしかできず、複数レコードの
1コラム目の比較をすることができませんでした。
おかげさまで体育の日に子供の運動会に行けます!
ありがとうございました!

新着レスの表示
レスを投稿する